इसका मतलब है कि आपके पास तालिका में कम से कम एक पंक्ति है जिसे float
. पर नहीं डाला जा सकता है . CASE
कर रहे हैं सुरक्षित है, लेकिन सीटीई का संयोजन और WHERE क्लॉज जोड़ना प्रोग्रामर की एक सामान्य भ्रम में पड़ता है जब टी-एसक्यूएल लिखते हैं:कि घोषणा का क्रम निष्पादन का एक आदेश दर्शाता है . प्रोग्रामर को C जैसी भाषाओं की अनिवार्य प्रक्रियात्मक शैली के लिए उपयोग किया जाता है और SQL की घोषणात्मक सेट आधारित प्रकृति को समझने में विफल होते हैं। मैंने इस मुद्दे के बारे में पहले भी लिखा है और उदाहरण दिया है जब भ्रम त्रुटियों का कारण बनता है:
- टी-एसक्यूएल फ़ंक्शन निष्पादन का एक निश्चित क्रम नहीं दर्शाते हैं
- SQL सर्वर बूलियन ऑपरेटर पर शॉर्ट-सर्किट
एक बार जब आप अपना पूरा कोड पोस्ट कर देते हैं तो हम देख सकते हैं कि आपने अपने मामले में वास्तव में कहां गलत किया और निष्पादन का एक निश्चित क्रम मान लिया।
अपडेट के बाद
ठीक है, इसलिए मुझे यह व्यवस्था करनी होगी कि आपके मामले में कोड निष्पादन के क्रम में सही है, result
पहले CASE
. का मूल्यांकन करने वाले कॉलम को अनुमानित नहीं किया जा सकता है . अगर केस WHERE क्लॉज में होता तो चीजें अलग होतीं।
आपकी समस्या अलग है:ISNUMERIC
. इस फ़ंक्शन को NUMERIC
. की बहुत उदार समझ है मतलब है और पहले कई डेवलपर्स को काट चुका है। अर्थात्, यह उन मानों को स्वीकार करता है जिन्हें CAST और CONVERT अस्वीकार कर देंगे। जैसे अल्पविराम वाले:
declare @n varchar(8000) = '1,000';
select isnumeric(@n);
select cast(@n as float);
select case when isnumeric(@n)=1 then cast(@n as float) else null end;
तो आपके पास वे मान हैं जो ISNUMERIC
. पास करते हैं परीक्षण लेकिन कनवर्ट करने में विफल। बस एक सिर ऊपर, जितना अधिक आप इस दृष्टिकोण में खोदेंगे, उतने अधिक बंद दरवाजे आपको मिलेंगे। सर्वर की तरफ आपको आवश्यक कास्ट करने का कोई सुरक्षित तरीका नहीं है। आदर्श रूप से, डेटा मॉडल को ठीक करें (यदि यह फ़्लोट संग्रहीत करता है तो फ़ील्ड को एक फ़्लोट बनाएं)। उसमें से कम, डेटा को ट्राइएज करें और उन सभी मानों को हटा दें जो उचित फ्लोट नहीं हैं, और फ्रंट-एंड/एप्लिकेशन को अब नए पेश नहीं करने के लिए ठीक करें, फिर एक बाधा जोड़ें जो नए खराब मान दिखाई देने पर त्रुटि को ट्रिगर करेगा। आप इसे एक प्रश्न में हल नहीं कर पाएंगे, कि सड़क शवों से अटी पड़ी है।
SQL सर्वर के अगले संस्करण के साथ आपके पास एक नया कार्य होगा, TRY_CONVERT
, जो आपकी समस्या का समाधान करेगा।