sql >> Base de Datos >  >> RDS >> Sqlserver

La conversión falló al convertir el valor varchar en la declaración del caso

Al usar CASE instrucción, todas las expresiones de resultado deben tener el mismo tipo de datos. De lo contrario, el resultado se convertirá al tipo de datos con mayor prioridad. Según BOL :

Desde INT tiene una mayor precedencia del tipo de datos que VARCHAR , "Weeks" convertirse a INT y eso produce el error:

Otro ejemplo que producirá el mismo error:

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

La solución es convertir RS.intInterval a VARCHAR :

CONVERT(VARCHAR(10), RS.intInterval)

Su consulta final debe ser:

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)