Perché questa CASE
espressione:
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
Produrre questo risultato?
Messaggio di errore: messaggio 8180, livello 16, stato 1, riga 1
non è stato preparato.
Messaggio 125, Livello 15, Stato 4, riga 1 Le
espressioni dei casi possono essere annidate solo al livello 10.
Chiaramente non c'è CASE
un'espressione nidificata qui, sebbene ci siano più di 10 "rami".
Un'altra stranezza. Questa funzione con valori di tabella incorporata produce lo stesso errore:
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
)
Ma un TVF multi-statement simile funziona bene:
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);
eSELECT CASE WHEN v.V = 'a' THEN 1 WHEN v.V = 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
traducono esattamente nello stesso piano di esecuzione (sentiti libero di verificarlo tu stesso), dove l'espressione CASE viene ridefinita comeCASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- con annidamento, come puoi vedere.