Dlaczego to CASE
wyrażenie:
SELECT CASE column
WHEN 'a' THEN '1'
WHEN 'b' THEN '2'
... c -> i
WHEN 'j' THEN '10'
WHEN 'k' THEN '11'
END [col]
FROM LinkedServer.database.dbo.table
Wyprodukować ten wynik?
Komunikat o błędzie: Msg 8180, poziom 16, stan 1, wiersz 1
Nie można przygotować oświadczenia.
Msg 125, poziom 15, stan 4, wiersz 1
Wyrażenia wielkości liter można zagnieżdżać tylko na poziomie 10.
Oczywiście nie ma tu zagnieżdżonego CASE
wyrażenia, chociaż jest więcej niż 10 „gałęzi”.
Kolejna osobliwość. Ta wbudowana funkcja wartościowana w tabeli powoduje ten sam błąd:
ALTER FUNCTION [dbo].[fn_MyFunction]
(
@var varchar(20)
)
RETURNS TABLE
AS
RETURN
(
SELECT CASE column
WHEN 'a' THEN '1'
WHEN 'b' THEN '2'
... c -> i
WHEN 'j' THEN '10'
WHEN 'k' THEN '11'
END [col]
FROM LinkedServer.database.dbo.table
)
Ale podobny TVF z wieloma stwierdzeniami działa dobrze:
ALTER FUNCTION [dbo].[fn_MyFunction]
(
@var varchar(20)
)
RETURNS @result TABLE
(
value varchar(max)
)
AS
BEGIN
INSERT INTO @result
SELECT CASE column
WHEN 'a' THEN '1'
WHEN 'b' THEN '2'
... c -> i
WHEN 'j' THEN '10'
WHEN 'k' THEN '11'
END [col]
FROM LinkedServer.database.dbo.table
RETURN;
END
SELECT CASE v.V WHEN 'a' THEN 1 WHEN 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
iSELECT CASE WHEN v.V = 'a' THEN 1 WHEN v.V = 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
przetłumacz na dokładnie ten sam plan wykonania (możesz to sprawdzić samodzielnie), w którym wyrażenie CASE jest redefiniowane jakoCASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- z zagnieżdżaniem, jak widać.