मैं एक SELECT
जो CASE
का उपयोग करता है एक उचित प्रकार में nvarchar मान परिवर्तित करने के लिए कुछ इस तरह कर रहा हूँ,:मामला तब खंड हमेशा से मूल्यांकन
SELECT CASE
WHEN @propType = 'money' THEN convert(money, datavalue)
[...]
ELSE datavalue
END
FROM [...]
हालांकि, ऐसा लगता convert
हमेशा निष्पादित किया जाता है, तब भी जब @propType
पैसे के बराबर नहीं है। चलने योग्य उदाहरण:
declare @proptype nvarchar(50)= 'nvarchar'
declare @val nvarchar(10) = 'test'
select
case @proptype
when 'money' then convert(money, @val)
else @val
end
यह क्यों है, और मैं इसके आसपास कैसे हो सकता हूं?
मामला बयान इसकी स्थितियों से क्रमिक रूप से मूल्यांकन करता है और पहली शर्त जिसका शर्त पूरी होने के साथ बंद हो जाता है: MSDN प्रलेखीकरण इस कहते हैं। कुछ परिस्थितियों में, एक अभिव्यक्ति का मूल्यांकन CASE कथन से पहले किया जाता है, अभिव्यक्ति के परिणामों को इसके इनपुट के रूप में प्राप्त करता है। में त्रुटियों का मूल्यांकन इन अभिव्यक्तियों का मूल्यांकन करना संभव है। कुल अभिव्यक्तियां जब किसी CASE कथन के तर्कों का मूल्यांकन पहले किया जाता है, तो CASE कथन के लिए प्रदान किया जाता है। उदाहरण के लिए, निम्नलिखित क्वेरी MAX कुल के मान का उत्पादन करते समय शून्य त्रुटि से विभाजित करती है। यह CASE अभिव्यक्ति का मूल्यांकन करने से पहले होता है।
मुझे यकीन नहीं है कि यह प्रासंगिक है, लेकिन भाषा गैर-मूल के लिए कुछ हद तक भारी है, तो शायद यह है?
स्पष्ट रूप से 'money' करने के लिए एक' varchar' परिवर्तित जब यह वापस 'varchar' को implicitely बदला न गया हो का एकमात्र उद्देश्य है, afaik शुरू करने के प्रयोजनों तो स्वरूपण कारण है कि आप या तो इसे आवश्यक स्वरूपण में स्टोर नहीं करते के लिए क्लाइंट को स्वरूपण को संभालने या उसके साथ जाने दें? –
स्रोत डेटा मेरे नियंत्रण में नहीं है। वास्तविक मामले में मुझे डेटा को ऐसे प्रारूप में लाने के लिए कुछ हुप्स से कूदना है, जिसे मैं इसे रिपोर्ट तालिका में डाल सकता हूं जिसके लिए इसे नियत किया गया है (जिसे ठीक से टाइप किया गया है) – carlpett