मुझे एक प्रश्न है जो मैंने अभी डेटाबेस में पाया है जो एक रिपोर्ट को गिरने में असफल रहा है। क्वेरी के बुनियादी सार:मैं न्यूमेरिक फ़ील्ड पर संख्यात्मक डेटा के बीच 'क्वेरी' कैसे पूछ सकता हूं?
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
And Convert(int, myField) Between @StartRange And @EndRange
अब, myField सभी पंक्तियों [यह nvarchar प्रकार का है] में संख्यात्मक डेटा शामिल नहीं है ... लेकिन इस क्वेरी स्पष्ट रूप से डिजाइन किया गया था इस तरह है कि यह केवल पंक्तियों का ध्यान रखता है जहां इस क्षेत्र में डेटा संख्यात्मक है।
इस के साथ समस्या यह है कि T-SQL (जैसा कि मैं समझता हूँ के पास) जहां खंड इस प्रकार यह रिकॉर्ड जहां डाटा अपवाद के साथ संख्यात्मक नहीं है पर बाहर खाई करने के लिए पैदा कर रहा shortcircuit नहीं करता है:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the nvarchar value '/A' to data type int.
उन सभी पंक्तियों को डंप करने का छोटा जहां MyField एक अस्थायी तालिका में संख्यात्मक है और फिर उन पंक्तियों के लिए पूछताछ करता है जहां फ़ील्ड निर्दिष्ट सीमा में है, मैं यह क्या कर सकता हूं यह इष्टतम है?
मेरी पहली पार्स विशुद्ध रूप से दिए गए डेटा का विश्लेषण करने और देखने के लिए प्रयास करने के लिए क्या हो रहा था जा रहा था:
Select *
From (
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
) t0
Where Convert(int, myField) Between @StartRange And @EndRange
लेकिन मैं एक ही त्रुटि मैं पहली बार क्वेरी जो मुझे यकीन है कि मुझे समझ में नहीं कर रहा हूँ के लिए किया था प्राप्त क्योंकि मैं किसी भी डेटा को परिवर्तित नहीं कर रहा हूं जो इस बिंदु पर संख्यात्मक नहीं होना चाहिए। सबक्वायरी केवल पंक्तियों को वापस करनी चाहिए जहां MyField में संख्यात्मक डेटा होता है।
शायद मुझे मेरी सुबह की चाय चाहिए, लेकिन क्या यह किसी के लिए समझ में आता है? आंखों का एक और सेट मदद करेगा।
अग्रिम धन्यवाद
ली गई तालिका तो पहले materialized नहीं प्राप्त करता है 'WHERE' खंड लागू होता है। इसे एक ऐसे दृश्य के रूप में माना जाता है जहां ऑप्टिमाइज़र एक दूसरे को फिर से लिखने के लिए एक रिलेशनल बीजगणित पीओवी के समान होता है, वे वही होते हैं। –
[इस पृष्ठ] के अनुसार (http://msdn.microsoft.com/en-us/library/aa226054 (SQL.80% 29.aspx), स्पष्ट रूप से 'nvchar' को' int' में परिवर्तित करने की आवश्यकता नहीं है। – NullUserException