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)