¿Por qué esta CASE
expresión:
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
Producir este resultado?
Mensaje de error: Msg 8180, Nivel 16, Estado 1, Línea
(s) No se pudieron preparar declaraciones.
Mensaje 125, Nivel 15, Estado 4, Línea 1 Las
expresiones de caso solo se pueden anidar al nivel 10.
Claramente, aquí no hay una CASE
expresión anidada , aunque hay más de 10 "ramas".
Otra rareza. Esta función en línea con valores de tabla produce el mismo error:
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
)
Pero un TVF de varias declaraciones similar funciona bien:
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);
ySELECT CASE WHEN v.V = 'a' THEN 1 WHEN v.V = 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
traduzca exactamente el mismo plan de ejecución (siéntase libre de verificarlo usted mismo), donde la expresión CASE se redefine comoCASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- con anidamiento, como puede ver.