Używając CASE instrukcji, wszystkie wyrażenia wynikowe muszą mieć ten sam typ danych. Jeśli nie, wynik zostanie przekonwertowany na typ danych o wyższym priorytecie. Według BOL
:
Od INT ma wyższy priorytet typu danych
niż VARCHAR , "Weeks" przekonwertować na INT co powoduje błąd:
Inny przykład, który spowoduje ten sam błąd:
SELECT CASE WHEN 1 = 1 THEN 'True' ELSE 0 END
Rozwiązaniem jest konwersja RS.intInterval do VARCHAR :
CONVERT(VARCHAR(10), RS.intInterval)
Twoje ostatnie zapytanie powinno brzmieć:
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)