Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर 2005 त्रुटि 701 - स्मृति से बाहर

यह प्रश्न वास्तव में यहाँ बार-बार उठता प्रतीत होता है। मार्क सही (और सबसे अधिक नियोजित) उत्तर है, लेकिन मुझे इसे स्पष्ट करने के लिए जो कुछ भी मैं कर सकता हूं उसे जोड़ने का प्रयास करें।

त्रुटि संदेश थोड़ा भ्रामक है। SQL सर्वर आपको बताता है कि उसके पास चलाने के लिए पर्याप्त मेमोरी नहीं है क्वेरी, लेकिन इसका वास्तव में अर्थ यह है कि इसमें पार्स . के लिए पर्याप्त मेमोरी नहीं है क्वेरी।

जब दौड़ने . की बात आती है क्वेरी, SQL सर्वर अपनी इच्छानुसार सभी का उपयोग कर सकता है - यदि आवश्यक हो तो गीगाबाइट। पार्सिंग एक और कहानी है; सर्वर को एक पार्स ट्री बनाना है और उसके लिए बहुत सीमित मात्रा में मेमोरी उपलब्ध है। मुझे कहीं भी वास्तविक सीमा का दस्तावेजीकरण नहीं मिला है, लेकिन INSERT . से भरे एक विशिष्ट बैच के लिए बयान, यह एक समय में कुछ एमबी से अधिक संभाल नहीं सकता है।

इसलिए मुझे आपको यह बताते हुए खेद हो रहा है लेकिन आप नहीं SQL सर्वर को इस स्क्रिप्ट को ठीक उसी तरह निष्पादित करें जैसे यह लिखा गया है। कोई रास्ता नहीं, कैसे नहीं, इससे कोई फर्क नहीं पड़ता कि आप किन सेटिंग्स में बदलाव करते हैं। हालांकि, इसके समाधान के लिए आपके पास कई विकल्प हैं:

विशेष रूप से, आपके पास तीन विकल्प हैं:

  1. GOका उपयोग करें बयान। इसका उपयोग SSMS और विभिन्न अन्य उपकरणों द्वारा बैच विभाजक के रूप में किया जाता है। संपूर्ण स्क्रिप्ट के लिए एकल पार्स ट्री जेनरेट किए जाने के बजाय, बैच के प्रत्येक सेगमेंट के लिए अलग-अलग पार्स ट्री जेनरेट किए जाते हैं, जिन्हें GO द्वारा अलग किया जाता है। . अधिकांश लोग यही करते हैं, और अभी भी स्क्रिप्ट को लेन-देन की दृष्टि से सुरक्षित बनाना बहुत आसान है, जैसा कि अन्य लोगों ने प्रदर्शित किया है और मैं यहां इसे नहीं दोहराऊंगा।

  2. सभी पंक्तियों को सम्मिलित करने के लिए एक विशाल स्क्रिप्ट बनाने के बजाय, डेटा को एक टेक्स्ट फ़ाइल (यानी अल्पविराम से अलग) में रखें। फिर इसे bcp उपयोगिता का उपयोग करके आयात करें। . यदि आपको "स्क्रिप्ट करने योग्य" होने के लिए इसकी आवश्यकता है - यानी आयात उसी स्क्रिप्ट/लेन-देन में होना चाहिए जैसे CREATE TABLE कथन, फिर बल्क इंसर्ट का उपयोग करें बजाय। हालांकि BULK INSERT एक गैर-लॉग ऑपरेशन है, मानो या न मानो, इसे अभी भी एक BEGIN TRAN में रखा जा सकता है / COMMIT TRAN ब्लॉक करें।

  3. अगर आप वाकई 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

उम्मीद है कि यह आपको सही रास्ते पर लाने में मदद करेगा। मुझे पूरा यकीन है कि इसमें आपके सभी उपलब्ध "बॉक्स में" विकल्प शामिल हैं - इन से परे, आपको काम करने के लिए वास्तविक एप्लिकेशन प्रोग्राम या शेल स्क्रिप्ट लिखना शुरू करना होगा, और मुझे नहीं लगता कि जटिलता का स्तर है वास्तव में यहाँ वारंट है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं एंटिटी फ्रेमवर्क में डिफ़ॉल्ट मान कैसे सेट कर सकता हूं?

  2. SQL सर्वर क्वेरीज़ की शब्दावली — DBA के लिए एक स्टिक शिफ्ट

  3. SQL में प्रत्येक समूह के लिए अधिकतम पंक्ति का चयन कैसे करें

  4. TSQL - डेटाबेस में सभी तालिकाओं में कॉलम जोड़ें [कर्सर उदाहरण]

  5. MSSQL 2008 R2 में समग्र कार्य के बिना धुरी