Mengapa CASE
ungkapan ini :
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
Hasilkan hasil ini?
Pesan kesalahan: Msg 8180, Level 16, Status 1, Baris 1
Pernyataan tidak dapat disiapkan.
Msg 125, Level 15, State 4, Line 1
Ekspresi kasus hanya dapat disarangkan ke level 10.
Jelas tidak ada sarang CASE
ekspresi sini, meskipun ada lebih dari 10 "cabang."
Keanehan lain. Fungsi bernilai tabel inline ini menghasilkan kesalahan yang sama:
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
)
Tetapi TVF multi-pernyataan yang serupa bekerja dengan baik:
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);
danSELECT CASE WHEN v.V = 'a' THEN 1 WHEN v.V = 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
terjemahkan dengan rencana eksekusi yang persis sama (jangan ragu untuk memverifikasi itu sendiri), di mana ekspresi KASUS didefinisikan ulang sebagaiCASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- dengan bersarang, seperti yang Anda lihat.