When using the CASE statement, all result expressions must have the same data type. If not, the result will be converted to a data type with a higher priority. According to BOL :
Returns the highest priority type from the set of types in result_expressions and optional else_result_expression.
Since INT has a higher data type priority than VARCHAR , "Weeks" converts to INT and causes an error:
Conversion error when converting varchar '' Weeks '' value to type int data
Another example that will lead to the same error:
SELECT CASE WHEN 1 = 1 THEN 'True' ELSE 0 END
The solution is to convert RS.intInterval to VARCHAR :
CONVERT(VARCHAR(10), RS.intInterval)
Your last request should be:
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)
source share