Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

La conversion a échoué lors de la conversion de la valeur varchar dans l'instruction case

Lors de l'utilisation de CASE , toutes les expressions de résultat doivent avoir le même type de données. Sinon, le résultat sera converti dans le type de données avec une priorité plus élevée. Selon BOL :

Depuis INT a une précédence des types de données plus élevée que VARCHAR , "Weeks" être converti en INT et cela produit l'erreur :

Un autre exemple qui produira la même erreur :

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

La solution est de convertir RS.intInterval en VARCHAR :

CONVERT(VARCHAR(10), RS.intInterval)

Votre requête finale devrait être :

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)