2011-08-25 17 views
5

के रूप में मूल्य डालने में असमर्थ हमारे पास एक SQL है जो ColumnA पर CAST फ़ंक्शन (FLOAT पर) करता है। एसक्यूएल में एक फ़िल्टर है जो अंत में अप्रत्यक्ष रूप से उन पंक्तियों को फ़िल्टर करेगा जिनके पास कॉलमए में गैर संख्यात्मक मान हैं। हालांकि, मुझे लगता है कि पैरालेल में एसक्यूएल के चल रहे हिस्सों के कारण मुझे विश्वास है कि सीएएसटी उन पंक्तियों पर भी लागू होता है जो फ़िल्टर किए जाते हैं और इससे एसक्यूएल विफल हो जाता है "फ्लोट के रूप में मूल्य डालने में असमर्थ ... "फ्लोट

मुझे पता है कि अगर मैं क्वेरी संकेत

OPTION (MAXDOP 1) 

कि SQL उम्मीद रन के रूप में जोड़कर एक proc साथ चलाते हैं। मुझे संदेह है कि 1 प्रो पर चलने से फ़िल्टर को कॉलम ए में गैर संख्यात्मक मानों के साथ पंक्ति को बुझाने के लिए लागू किया जाता है ताकि उसके मूल्यों का कास्ट सफल हो सके। मैंने यह भी पाया कि क्वेरी संकेत का उपयोग कर

OPTION (FORCE ORDER) 

फिक्स मुद्दा, मैं becausethis भी यह सोचते हैं हूँ सुनिश्चित करता है कि फिल्टर पहले लागू किया जाता है और मैं काफी बेहतर क्वेरी प्रदर्शन है कि एक सिलेंडर पर चल रहे एक मिलता है।

मैं दूसरे विकल्प का उपयोग करके इस मुद्दे को ठीक करने के लिए टॉरवर्ड को झुका रहा हूं। अगर मुझे यहां क्या हो रहा है या कोई सिफारिश करने के बारे में कोई गलत धारणा है या कोई मेरी समझ को समझने या सिफारिश करने के लिए विस्तार करना चाहता है, तो मैं इसकी सराहना करता हूं।

मैं पर

Microsoft SQL सर्वर 2008 R2 (RTM) चला रहा हूँ - 10.50.1720.0 (64) जून 12 2010 01:34:59 कॉपीराइट (c) Microsoft Corporation एंटरप्राइज़ संस्करण (64 बिट) Windows NT 5.2 पर (3790 बिल्ड: सर्विस पैक 2)

एक बाद का विचार:

ऐसा लगता है कि यह अच्छा होगा T-SQL अगर एक स्ट्रिंग सकता है देखने के लिए जाँच करने के लिए निम्नलिखित कार्य था व्यक्त किया जाना एक विशेष डेटाटाइप के लिए rted।

IsFloat IsNumeric IsInteger आदि

मैं वास्तव में नाराज कर रहा हूँ कि कितने कि मैं हमारे डेटाबेस में खोजने के डेटा के सभी प्रकार है कि varchar (255) के रूप में परिभाषित कर रहे हैं के कॉलम। मुझे लगता है कि समाधान "ऐसा नहीं करना है!"

+2

कृपया आप एसक्यूएल दिखा सकते हैं? – MatBailie

+1

आप हमें कार को वास्तव में देखे बिना अपनी कार को ठीक करने में मदद करने के लिए कह रहे हैं। कृपया हमें कार दिखाएं। – JNK

+0

टी-एसक्यूएल में IsNumeric – MatBailie

उत्तर

4

आपके विचार के बारे में।

ऐसा लगता है कि यह अच्छा होगा T-SQL जाँच करने के लिए निम्नलिखित कार्य किया था देखने के लिए एक स्ट्रिंग एक विशेष डेटाप्रकार लिए परिवर्तित किया जा सकता है अगर है।

एसक्यूएल सर्वर 2012 इस आवश्यकता के लिए TRY_CONVERT पेश करता है। तो निम्न क्वेरी एक त्रुटि के बजाय NULL वापस आ जाएगी।

SELECT TRY_CONVERT (FLOAT, 'Fish') 

भी धारावाहिक की योजना है कि WHERE खंड से पहले SELECT मूल्यांकन किया जाता है क्या होगा के साथ कोई गारंटी नहीं है। जैसा कि SQL Server 2005 से in this blog post समझाया गया है, इसके बाद पिछले संस्करणों की तुलना में यह होने की संभावना अधिक है। Behavior Changes to Database Engine Features in SQL Server 2005 विशेष रूप से निम्नानुसार इसे कॉल करता है।

SQL सर्वर 2005 कभी कभी की तुलना में जल्दी प्रश्नों में भाव का मूल्यांकन करता है, जब वे एसक्यूएल सर्वर में मूल्यांकन किया जाता 2000 यह व्यवहार निम्नलिखित महत्वपूर्ण लाभ प्रदान करता है:

  • को अभिकलन स्तंभों पर अनुक्रमित पूरे करने की क्षमता एक क्वेरी में अभिव्यक्ति जो गणना कॉलम अभिव्यक्ति के समान हैं।
  • अभिव्यक्ति परिणामों की अनावश्यक गणना की रोकथाम। इस व्यवहार के बारे

अधिक चर्चा क्रेग फ्रीडमैन Conversion and Arithmetic Errors से एक और अच्छा ब्लॉग पोस्ट में है।

2012 और TRY_CONVERT से पहले के संस्करणों पर आपको CASE कथन में CAST AS FLOAT को लपेटने की आवश्यकता है। जैसे

SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col 
    FROM Table 
    WHERE ISNUMERIC(Col)=1 

यह अभी भी पूरी तरह से बस की जाँच करता है कि मूल्य नहीं बल्कि विशेष रूप से से सांख्यिक डेटाटाइप्स से एक के लिए डाली An example of an input that would fail is '.'

CASE फ्लोट करने के लिए होगा प्रलेखित है आप खुद ISNUMERIC के रूप में त्रुटियों के लिए हो रही रोकने के लिए इसकी गारंटी नहीं है ज्यादातर किताबों में शॉर्ट सर्किट ऑनलाइन (some exceptions are discussed here)

तुम भी कनेक्ट आइटम SQL Server should not raise illogical errors में इस बारे में अतिरिक्त चर्चा/शिकायतों पा सकते हैं और एक good explanation of a similar issue SQLKiwi

012,351,641 द्वारा
1

मेरा मानना ​​है कि आप सही हैं। CONVERT() फ़ंक्शन को "अप्रत्यक्ष रूप से फ़िल्टर" पंक्तियों से पहले लागू किया जा रहा है।

अपवाद से बचने के लिए, आप सही हैं, एक दृष्टिकोण निष्पादन योजना में संचालन के क्रम में नियंत्रण के कुछ मोडिकम प्राप्त करने का प्रयास करना है। यदि कथन संकेत आपके लिए काम कर रहा है, तो आप उसके साथ जा सकते हैं। (व्यक्तिगत रूप से, संकेत मेरे लिए आखिरी उपाय हैं।)

ध्यान दें कि SQL सर्वर में एक IsNumeric फ़ंक्शन है।

IsNumeric फ़ंक्शन कुछ हद तक अपर्याप्त है, इस अर्थ में कि कुछ मान हैं जो एक IsNumeric परीक्षण "पास" करेंगे, लेकिन जब वे एक संख्यात्मक डेटाटाइप में परिवर्तित हो जाते हैं तो अपवाद उठाएंगे।

व्यक्तिगत रूप से, मैं इस दृष्टिकोण के साथ जाने के लिए करते हैं जाएगा:

select convert(float,case when isnumeric(t.foo)=1 then t.foo else null end) 
बयान स्तर

बजाय संकेत।

या, मैं अन्य भविष्यवाणियों को निर्दिष्ट करता हूं जिन्हें उन मानों को "फ़िल्टर" करना चाहिए जिन्हें परिवर्तित नहीं किया जाना चाहिए।

select convert(float,case when t.fi in ('fo','fum') then t.foo else null end) 
संबंधित मुद्दे