यह प्रश्न वास्तव में यहाँ बार-बार उठता प्रतीत होता है। मार्क सही (और सबसे अधिक नियोजित) उत्तर है, लेकिन मुझे इसे स्पष्ट करने के लिए जो कुछ भी मैं कर सकता हूं उसे जोड़ने का प्रयास करें।
त्रुटि संदेश थोड़ा भ्रामक है। SQL सर्वर आपको बताता है कि उसके पास चलाने के लिए पर्याप्त मेमोरी नहीं है क्वेरी, लेकिन इसका वास्तव में अर्थ यह है कि इसमें पार्स . के लिए पर्याप्त मेमोरी नहीं है क्वेरी।
जब दौड़ने . की बात आती है क्वेरी, SQL सर्वर अपनी इच्छानुसार सभी का उपयोग कर सकता है - यदि आवश्यक हो तो गीगाबाइट। पार्सिंग एक और कहानी है; सर्वर को एक पार्स ट्री बनाना है और उसके लिए बहुत सीमित मात्रा में मेमोरी उपलब्ध है। मुझे कहीं भी वास्तविक सीमा का दस्तावेजीकरण नहीं मिला है, लेकिन INSERT
. से भरे एक विशिष्ट बैच के लिए बयान, यह एक समय में कुछ एमबी से अधिक संभाल नहीं सकता है।
इसलिए मुझे आपको यह बताते हुए खेद हो रहा है लेकिन आप नहीं SQL सर्वर को इस स्क्रिप्ट को ठीक उसी तरह निष्पादित करें जैसे यह लिखा गया है। कोई रास्ता नहीं, कैसे नहीं, इससे कोई फर्क नहीं पड़ता कि आप किन सेटिंग्स में बदलाव करते हैं। हालांकि, इसके समाधान के लिए आपके पास कई विकल्प हैं:
विशेष रूप से, आपके पास तीन विकल्प हैं:
-
GO
का उपयोग करें बयान। इसका उपयोग SSMS और विभिन्न अन्य उपकरणों द्वारा बैच विभाजक के रूप में किया जाता है। संपूर्ण स्क्रिप्ट के लिए एकल पार्स ट्री जेनरेट किए जाने के बजाय, बैच के प्रत्येक सेगमेंट के लिए अलग-अलग पार्स ट्री जेनरेट किए जाते हैं, जिन्हेंGO
द्वारा अलग किया जाता है। . अधिकांश लोग यही करते हैं, और अभी भी स्क्रिप्ट को लेन-देन की दृष्टि से सुरक्षित बनाना बहुत आसान है, जैसा कि अन्य लोगों ने प्रदर्शित किया है और मैं यहां इसे नहीं दोहराऊंगा। -
सभी पंक्तियों को सम्मिलित करने के लिए एक विशाल स्क्रिप्ट बनाने के बजाय, डेटा को एक टेक्स्ट फ़ाइल (यानी अल्पविराम से अलग) में रखें। फिर इसे bcp उपयोगिता का उपयोग करके आयात करें। . यदि आपको "स्क्रिप्ट करने योग्य" होने के लिए इसकी आवश्यकता है - यानी आयात उसी स्क्रिप्ट/लेन-देन में होना चाहिए जैसे
CREATE TABLE
कथन, फिर बल्क इंसर्ट का उपयोग करें बजाय। हालांकिBULK INSERT
एक गैर-लॉग ऑपरेशन है, मानो या न मानो, इसे अभी भी एकBEGIN TRAN
में रखा जा सकता है /COMMIT TRAN
ब्लॉक करें। -
अगर आप वाकई
INSERT
. चाहते हैं एक लॉग ऑपरेशन होने के लिए, और बैचों में सम्मिलन नहीं होना चाहते हैं, तो आप ओपनरोसेट टेक्स्ट फ़ाइल, एक्सेल फ़ाइल, आदि को एड-हॉक "टेबल" के रूप में खोलने के लिए, और फिर इसे अपनी नव-निर्मित तालिका में डालें। मैं आमतौर परOPENROWSET
. के उपयोग की अनुशंसा करने से कतराता हूं , लेकिन चूंकि यह स्पष्ट रूप से एक प्रशासनिक लिपि है, यह वास्तव में कोई बड़ी समस्या नहीं है।
पिछली टिप्पणियों से पता चलता है कि आप #1 के साथ असहज हैं, हालांकि यह सिर्फ एक गलत धारणा के कारण हो सकता है कि यह एक ही लेन-देन में नहीं किया जा सकता है, इस मामले में देखें थॉमस
का उत्तर। लेकिन अगर आप दूसरे रास्ते पर जाने के लिए तैयार हैं, तो मेरा सुझाव है कि #2 के साथ जाएं, एक टेक्स्ट फ़ाइल बनाएं और BULK INSERT
का उपयोग करें। . "सुरक्षित" स्क्रिप्ट का एक उदाहरण होगा:
BEGIN TRAN
BEGIN TRY
CREATE TABLE MyTable (...)
BULK INSERT MyTable
FROM 'C:\Scripts\Data\MyTableData.txt'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\r\n',
BATCHSIZE = 1000,
MAXERRORS = 1
)
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
उम्मीद है कि यह आपको सही रास्ते पर लाने में मदद करेगा। मुझे पूरा यकीन है कि इसमें आपके सभी उपलब्ध "बॉक्स में" विकल्प शामिल हैं - इन से परे, आपको काम करने के लिए वास्तविक एप्लिकेशन प्रोग्राम या शेल स्क्रिप्ट लिखना शुरू करना होगा, और मुझे नहीं लगता कि जटिलता का स्तर है वास्तव में यहाँ वारंट है।