Чому цей CASE
вираз:
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
Даєте цей результат?
Повідомлення про помилку: Msg 8180, Рівень 16, Стан 1,
Звіт 1 рядків не вдалося підготувати.
Msg 125, Рівень 15, Стан 4, Рядок 1
Виразки можуть бути вкладені лише до рівня 10.
Зрозуміло, що тут немає вкладеного CASE
виразу, хоча існує більше 10 "гілок".
Ще одна дивацтво. Ця вбудована таблична функція створює ту саму помилку:
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
)
Але подібна TV-версія з різними заявами працює чудово:
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);
і інше,SELECT CASE WHEN v.V = 'a' THEN 1 WHEN v.V = 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
перекладіть точно на той самий план виконання (сміливо переконайтеся, що для себе), де вираз CASE переосмислюється якCASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- з введенням, як ви бачите.