मेरी समस्या (या कम से कम त्रुटि संदेश) आंतरिक संसाधनों से बाहर भाग गए क्वेरी प्रोसेसर के समान है - अत्यंत लंबी एसक्यूएल क्वेरी ।
मेरा ग्राहक एक SQL चयन-क्वेरी के साथ काम कर रहा है, जिसमें बिल्कुल 100,000 प्रविष्टियों के साथ एक क्लॉज है।
त्रुटि 8632 और त्रुटि संदेश के साथ क्वेरी विफल हो रही है
आंतरिक त्रुटि: एक अभिव्यक्ति सेवाओं की सीमा पूरी हो चुकी है। कृपया अपनी क्वेरी में संभावित जटिल अभिव्यक्तियों की तलाश करें, और उन्हें सरल बनाने का प्रयास करें।)
मुझे यह बहुत अजीब लगता है कि यह त्रुटि संदेश बिल्कुल 100,000 प्रविष्टियों पर फेंका गया है, इसलिए मुझे आश्चर्य है कि क्या यह एक विन्यास योग्य मूल्य है। क्या यह मामला है और मामले में हाँ, मैं इस मूल्य को उच्चतर कैसे बढ़ा सकता हूं?
पर MSDN , वहाँ प्रस्ताव क्वेरी फिर से पुनर्लेखन के लिए है, लेकिन मैं इस से बचने के लिए चाहते हैं।
इस बीच मुझे पता चला कि जिन प्रविष्टियों के बारे में मैं बात कर रहा हूँ उनमें प्राकृतिक संख्याएँ हैं, उनमें से कुछ क्रमबद्ध हैं (कुछ ऐसा है (1,2,3,6,7,8,9,10,12) 13,15,16,17,18,19,20)।
यह एसक्यूएल बनाता है जहाँ-क्लॉज कुछ इस तरह है:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
मैं इस में बदल सकता है:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
क्या इसे छोटा किया जा सकता है:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... या ऐसा ही कुछ? (मुझे पता है कि यह एक लंबा शॉट है, लेकिन यह सॉफ़्टवेयर अपडेट को आसान और अधिक पठनीय बना देगा)
आपकी जानकारी के लिए: जहां-जहां खंड में डेटा एक गणना का परिणाम है, दूसरी तालिका पर किया जाता है: पहले उस तालिका की प्रविष्टियां पढ़ी जाती हैं और शुरुआत में फ़िल्टर की जाती हैं, फिर कुछ अतिरिक्त प्रसंस्करण किया जाता है (जिसका उपयोग करना असंभव है एसक्यूएल), उस अतिरिक्त प्रसंस्करण का परिणाम अधिक फ़िल्टरिंग है और उस के परिणाम का उपयोग जहां-जहां-खंड में किया जाता है। चूंकि एसक्यूएल में पूरा फ़िल्टरिंग लिखना असंभव था, इसलिए उल्लिखित विधि का उपयोग किया गया है। जाहिर है कि जहां-जहां प्रत्येक खंड में क्लॉज की सामग्री बदल सकती है, इसलिए एक गतिशील समाधान की आवश्यकता है।
WHERE IN
उस प्रकार के श्रेणी सिंटैक्स का समर्थन नहीं करता है। इसके अलावा, यहWHERE () OR () OR ()
नहीं होना चाहिए । लेकिन ब्रेंट के सुझाव का उपयोग करने के लिए, आपको वास्तव में पूरी क्वेरी को बदलने की ज़रूरत नहीं है, आप बस कर सकते हैंWHERE IN (SELECT myID FROM #biglist)
। और#biglist
या तो एक वास्तविक (स्थायी) टेबल हो सकता है, या एक अस्थायी तालिका जो आप मक्खी पर बनाते हैं।