7

की लंबाई में सीमा क्या है SQL सर्वर संभाल सकता है कि एक क्वेरी की लंबाई में एक सीमा है?एक SQLCommand क्वेरी

मेरे पास एक सामान्य SqlCommand ऑब्जेक्ट है और एक स्ट्रिंग के रूप में एक बहुत लंबा चयन कथन पास करता है।

SQL सर्वर 2005/2008 इंजन के विरुद्ध चलते समय क्वेरी ठीक लगती है लेकिन SQL Server 2000 इंजन के विरुद्ध निष्पादित नहीं होती है।

मुझे कोई त्रुटि विवरण नहीं है क्योंकि मेरे पास केवल यह जानकारी तीसरी है लेकिन मेरा आवेदन अपेक्षित काम नहीं कर रहा है। मैं एक SQL Server 2000 इंस्टेंस स्थापित करने की परेशानी पर जा सकता था लेकिन मैं बस सोच रहा था कि किसी के पास जल्दी है या नहीं। हां SQL Server 2000 में 4K या 8K सीमा है लेकिन 2005 के प्रकार के उत्तर में नहीं।

मुझे पता है कि मैं संग्रहित प्रक्रियाओं इस्तेमाल कर सकते हैं लेकिन यह मान मैं उन्हें का उपयोग नहीं कर :-)

उत्तर

6

SqlServer 2000 के लिए एक वैध कारण है की सुविधा देता है कर रहा हूँ सहारा प्रश्नों के लिए एक 4000 वर्ण क्वेरी सीमा होती है।

क्या आप इसे संग्रहीत प्रक्रिया में जोड़ सकते हैं?

+0

यही मुझे डर था। हां, मैं कर सकता हूं, समस्या यह है कि मेरे पास डेटाबेस पर प्रबंधन नहीं है जिसका मतलब है कि स्पॉक्स इत्यादि जोड़ना मेरे नियंत्रण में नहीं है। –

+0

जो एक प्रश्न का एक हेक होना चाहिए ... – JoshBerke

+0

यह निश्चित रूप से है, मुझे कुछ गंभीर कॉलम मैनिपुलेशन करना है ... इसलिए गतिशील रूप से कई स्तंभों पर बाएं, दाएं, स्थानांतरित करें। –

6

यहाँ एक विचार है:

SQLServer 2000 के VARCHAR 8000 अक्षरों तक की अनुमति देता है, तो यह काम हो सकता है:

स्यूडोकोड:

SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD"); 
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR); 
+0

यह एक अच्छा विचार है और अगर मैं 4K –

-2

क्योंकि एसक्यूएल इंजेक्शन के ऐसा करने के लिए न करें। यदि ऐप के डायनामिक एसक्यूएल को उपयोगकर्ता द्वारा बिल्कुल इस्तेमाल किया जा सकता है तो इसे छोड़ दें।

भी - एसपी को बनाए रखने के लिए आसान होने पर विचार करें और यह एसक्यूएल इंजेक्शन के साथ भी मदद करता है।

+0

के तहत क्वेरी नहीं प्राप्त कर सकता तो मैं इसका उपयोग करूंगा जैसा कि मैंने कहा था, मेरे पास डेटाबेस पर नियंत्रण नहीं है। लेकिन हाँ मैं एसक्यूएल इंजेक्शन की संभावना से अवगत हूं। चूंकि SQL सर्वर बहुत लॉक हो गया है और ऐप एक बंद नेटवर्क पर है, इस समय यह एक प्रमुख विचार नहीं है। –

+0

ओह और मैं उपयोगकर्ता इनपुट को स्वच्छ करता हूं लेकिन आप कभी भी सुनिश्चित नहीं हो सकते कि आप कर सकते हैं। –

+1

मैं लर्किन हूं ... हे गतिशील एसक्यूएल अच्छा है यदि आप अपने प्रश्नों को पैरामीट करते हैं ... (विशेष रूप से यदि पैरामीटर उपयोगकर्ता इनपुट से हैं) – JoshBerke

6

गतिशील प्रश्नों के लिए एक अवश्य पढ़ना चाहिए ... The Curse and Blessings of Dynamic SQL, मैं अत्यधिक अनुशंसा करता हूं कि आप इसे पढ़ लें। इस समय आपकी मदद नहीं कर सकता है लेकिन यह निश्चित रूप से भविष्य में आपकी मदद करेगा ..

लेख से उद्धरण, बस मामले में।

sp_executesql और लांग एसक्यूएल स्ट्रिंग्स एसक्यूएल 2000

में वहाँ, एसक्यूएल 2000 और एसक्यूएल 7 पर sp_executesql के साथ एक सीमा है जब से तुम 4000 वर्णों से अधिक लंबा एसक्यूएल तार का उपयोग नहीं कर सकते हैं। (SQL 2005 और बाद में, आपको इस समस्या से बचने के लिए nvarchar (MAX) का उपयोग करना चाहिए।) यदि आप sp_executesql का उपयोग करना चाहते हैं, तो जब आपकी क्वेरी स्ट्रिंग पैरामीटरयुक्त क्वेरी योजनाओं का उपयोग करने के लिए इस सीमा से अधिक हो जाती है, तो वास्तव में एक वर्कअराउंड होता है। बुद्धि के लिए, आपको EXEC() में sp_executesql लपेट कर सकते हैं:

घोषित @ sql1 nvarchar (4000), @ sql2 nvarchar (4000), @state चार (2) चयन @state = 'सीए' का चयन करें @ sql1 = N'SELECT COUNT (*) ' SELECT @ sql2 = N'FROM dbo.Authors कहां राज्य = @ स्टेट' EXEC ('EXEC sp_executesql N' '+ @ sql1 + @ sql2 +' '', एन '@state char (2)' ', @state =' '' + @state + '' '')

यह काम करता है, क्योंकि sp_executesql के लिए @stmt पैरामीटर ntext है, इसलिए स्वयं ही यह करता है आकार में कोई सीमा नहीं है।

तुम भी, सम्मिलित करें-EXEC का उपयोग कर इस उदाहरण में से उत्पादन पैरामीटर का उपयोग कर सकते हैं:

CREATE TABLE #result (cnt पूर्णांक नहीं NULL) घोषित @ sql1 nvarchar (4000), @ sql2 nvarchar (4000), @state चार (2), @mycnt पूर्णांक @state = 'सीए' का चयन @ sql1 = N'SELECT @cnt = COUNT (* का चयन करें) ' @ sql2 = N'FROM dbo.authors कहां का चयन करें राज्य = @ स्टेट ' INSERT #result (cnt) EXEC (' DECLARE @cnt int EXEC sp_executesql एन '' + @ sql1 + @ sql2 + '' ', एन '' @ राज्य चार (2), @cnt पूर्णांक आउटपुट ', @state =' '' + @state + '', @cnt = @cnt आउटपुट चयन @cnt ') का चयन करें @ mycnt = cnt #result

यदि आपको लगता है कि यह इसके लायक होने के लिए बहुत गन्दा है तो आपको मेरी समझ है।

+0

अच्छी चीजें दिखता है, धन्यवाद! –

2

मैंने एएस/400 के खिलाफ पूछे जाने वाले प्रश्नों के लिए 2k सीमा में भाग लिया है। मैं आमतौर पर सभी सफेद जगहों को हटाकर 2k सीमा के नीचे पहुंचने में कामयाब रहा - यह क्वेरी को अपठनीय बनाता है लेकिन सीमा के नीचे आने का यह सबसे आसान तरीका है।

2

अपने अनुभव में, मैंने पाया कि, पहली बार क्वेरी की लंबाई पर SQLServer2000 सीमा लगती थी, वास्तव में (विश्वास है या नहीं) वास्तव में एक क्वेरी की लंबाई पर एक सीमा नहीं है, लेकिन, एक है क्वेरी में दिए गए किसी भी लाइन की लंबाई पर सीमित करें।
यह लगभग एक साल पहले था जब मैं इसमें भाग गया था, इसलिए मेरे सिर के ऊपर से मुझे याद नहीं आया कि लाइन की लंबाई क्या थी, लेकिन आप विशाल क्वेरी को अधिकतम लाइन लंबाई 64K या वहां के रूप में विभाजित करने का प्रयास कर सकते हैं , और देखें कि यह कैसे चला जाता है। मेरी यादें यह है कि लाइन की लंबाई सीमा 64K हो सकती है, मान लीजिए या नहीं। मैंने इस असाधारण-लंबी क्वेरी को लिया था (एक एसक्यूएल-जेनरेटर प्रोग्राम द्वारा उत्पन्न किया गया था), क्वेरी लगभग 80K लंबी थी, और मैंने इसे नोटपैड में आधे हिस्से में विभाजित किया (यानी, मैंने एसक्यूएल कोड में आधे रास्ते पर एक लाइनफीड लगाया --- लेकिन मैंने सुनिश्चित किया कि किसी भी शब्द को विभाजित न करें), और फिर पूरी चीज क्वेरी विश्लेषक कमांड विंडो में चिपका दी। फिर यह काम करता था, बीच में कहीं भी लाइनफीड होने के कारण इस प्रकार की 2 लाइनें 64K से कम लंबी होती हैं। आशा है कि ये आपकी मदद करेगा। यदि नहीं, तो छोटी रेखा लंबाई का प्रयास करें। मुझे यकीन है कि जब मुझे अपनी क्वेरी उस बिंदु पर मिली जहां उसके भीतर कोई रेखा नहीं थी, तो एक निश्चित लंबाई से अधिक हो गया, समग्र क्वेरी काम करती थी।

संबंधित मुद्दे