Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die Konvertierung ist beim Konvertieren des Varchar-Werts in die Case-Anweisung fehlgeschlagen

Bei Verwendung von CASE -Anweisung müssen alle Ergebnisausdrücke denselben Datentyp haben. Wenn nicht, wird das Ergebnis in den Datentyp mit höherer Priorität konvertiert. Gemäß BOL :

Da INT hat eine höhere Datentyppriorität als VARCHAR , "Weeks" in INT umgewandelt werden und das erzeugt den Fehler:

Ein weiteres Beispiel, das denselben Fehler erzeugt:

SELECT CASE WHEN 1 = 1 THEN 'True' ELSE 0 END

Die Lösung besteht darin, RS.intInterval zu konvertieren zu VARCHAR :

CONVERT(VARCHAR(10), RS.intInterval)

Ihre letzte Abfrage sollte lauten:

DECLARE @bFlag bit
SET @bFlag = 0
SELECT  something = CASE
                WHEN @bFlag = 1 THEN
                    CASE
                        WHEN RS.intInterval = 1 THEN '"Days"'
                        WHEN RS.intInterval = 2 THEN '"Weeks"'
                        WHEN RS.intInterval = 3 THEN '"Months"'
                        WHEN RS.intInterval = 4 THEN '"Years"'
                    END
                Else 
                    CONVERT(VARCHAR(10), RS.intInterval)
                End
from    MyTable  AS RS WITH (NOLOCK)