यह 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
कथन (s) तैयार नहीं किया जा सका।
Msg 125, Level 15, State 4, Line 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
- जैसे घोंसले के शिकार, जैसा कि आप देख सकते हैं।