Por que essa CASE
expressão:
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
Produzir esse resultado?
Mensagem de erro:
Não foi possível preparar a mensagem 8180, nível 16, estado 1, declarações da linha 1 .
Msg 125, nível 15, estado 4, linha 1 As
expressões de caso podem ser aninhadas apenas no nível 10.
Claramente, não há uma CASE
expressão aninhada aqui, embora haja mais de 10 "ramificações".
Outra esquisitice. Esta função com valor de tabela embutido produz o mesmo erro:
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
)
Mas um TVF de múltiplas declarações semelhante funciona bem:
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);
traduzir para exatamente o mesmo plano de execução (sinta-se livre para verificar isso por si mesmo), onde a expressão CASE é redefinida comoCASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- com nidificação, como você pode ver.