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
यदि आपको लगता है कि यह इसके लायक होने के लिए बहुत गन्दा है तो आपको मेरी समझ है।
यही मुझे डर था। हां, मैं कर सकता हूं, समस्या यह है कि मेरे पास डेटाबेस पर प्रबंधन नहीं है जिसका मतलब है कि स्पॉक्स इत्यादि जोड़ना मेरे नियंत्रण में नहीं है। –
जो एक प्रश्न का एक हेक होना चाहिए ... – JoshBerke
यह निश्चित रूप से है, मुझे कुछ गंभीर कॉलम मैनिपुलेशन करना है ... इसलिए गतिशील रूप से कई स्तंभों पर बाएं, दाएं, स्थानांतरित करें। –