Tại sao CASE
biểu hiện này :
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
Sản xuất kết quả này?
Thông báo lỗi:
Không thể chuẩn bị Msg 8180, Cấp 16, Trạng thái 1, Dòng 1 .
Msg 125, Cấp 15, Trạng thái 4, Dòng 1
Biểu thức trường hợp chỉ có thể được lồng vào cấp 10.
Rõ ràng không có CASE
biểu thức lồng nhau ở đây, mặc dù có hơn 10 "nhánh".
Một điều kỳ lạ khác. Hàm có giá trị bảng nội tuyến này tạo ra cùng một lỗi:
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
)
Nhưng một TVF đa tuyên bố tương tự hoạt động tốt:
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);
vàSELECT CASE WHEN v.V = 'a' THEN 1 WHEN v.V = 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
dịch sang chính xác cùng một kế hoạch thực hiện (hãy tự mình xác minh điều đó), trong đó biểu thức CASE được xác định lại làCASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- với lồng nhau, như bạn có thể thấy.