Pourquoi cette CASE
expression:
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
Produire ce résultat?
Message d'erreur: Msg 8180, niveau 16, état 1, ligne 1
déclaration (s) n'a pas pu être préparé.
Msg 125, niveau 15, état 4, ligne 1
Les expressions de cas ne peuvent être imbriquées qu'au niveau 10.
Clairement, il n'y a pas d' CASE
expression imbriquée ici, bien qu'il y ait plus de 10 "branches".
Encore une bizarrerie. Cette fonction de valeur de table en ligne produit la même erreur:
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
)
Mais un TVF multi-déclarations similaire fonctionne très 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);
et seSELECT CASE WHEN v.V = 'a' THEN 1 WHEN v.V = 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
traduisent exactement par le même plan d'exécution (n'hésitez pas à le vérifier par vous-même), où l'expression CASE est redéfinie commeCASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- avec l'imbrication, comme vous pouvez le voir.