ทำไม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
สร้างผลลัพธ์นี้หรือไม่
ข้อความแสดงข้อผิดพลาด: ข่าวสารเกี่ยวกับ 8180, ระดับ 16, สถานะ 1, คำสั่ง Line 1
ไม่สามารถจัดเตรียมได้
ข่าวสารเกี่ยวกับ 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
)
แต่ TVF หลายข้อความที่คล้ายกันทำงานได้ดี:
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
ด้วย - โดยมีการซ้อนกันตามที่คุณเห็น