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)