यह प्रश्न वास्तव में यहां हर बार आने लगता है। Mark में सही (और आमतौर पर नियोजित) उत्तर है, लेकिन मुझे यह स्पष्ट करने के लिए जो कुछ भी मैं कर सकता हूं उसे जोड़ने की कोशिश करता हूं।
त्रुटि संदेश थोड़ा भ्रामक है। एसक्यूएल सर्वर आपको बताता है कि इसमें रन क्वेरी के लिए पर्याप्त स्मृति नहीं है, लेकिन इसका वास्तव में क्या अर्थ है कि इसमें पार्स क्वेरी के लिए पर्याप्त स्मृति नहीं है।
जब क्वेरी चल रहा है, तो SQL सर्वर सभी आवश्यकतानुसार उपयोग कर सकता है - यदि आवश्यक हो तो गीगाबाइट्स। पार्सिंग एक और कहानी है; सर्वर को एक पार्स पेड़ बनाना है और इसके लिए केवल स्मृति की एक सीमित मात्रा उपलब्ध है। मुझे कहीं भी दस्तावेज की वास्तविक सीमा कभी नहीं मिली है, लेकिन INSERT
कथन से भरा एक सामान्य बैच के लिए, यह एक समय में कुछ एमबी से अधिक संभाल नहीं सकता है।
तो मुझे आपको यह बताने में खेद है कि आप नहीं कर सकते हैं SQL सर्वर इस स्क्रिप्ट को ठीक उसी तरह निष्पादित करता है जैसा लिखा है। कोई रास्ता नहीं, कोई फर्क नहीं पड़ता कि आप किन सेटिंग्स को ट्विक करते हैं।
उपयोग GO
बयान:
विशेष रूप से, आप तीन विकल्प हैं: आप करते हैं, हालांकि, विकल्पों में से एक नंबर उसके चारों ओर काम करना है। इसका उपयोग एसएसएमएस और बैच विभाजक के रूप में कई अन्य उपकरणों द्वारा किया जाता है। पूरी लिपि के लिए एक ही पार्स पेड़ उत्पन्न होने के बजाय, GO
से अलग बैच के प्रत्येक खंड के लिए अलग-अलग पार्स पेड़ उत्पन्न होते हैं। अधिकांश लोग ऐसा करते हैं, और स्क्रिप्ट को लेनदेन-सुरक्षित बनाने के लिए यह बहुत आसान है, जैसा कि अन्य ने दिखाया है और मैं यहां दोहराना नहीं चाहूंगा।
सभी पंक्तियों को सम्मिलित करने के लिए एक विशाल स्क्रिप्ट उत्पन्न करने के बजाय, डेटा को एक टेक्स्ट फ़ाइल (यानी अल्पविराम से अलग) में रखें। फिर इसे bcp utility का उपयोग करके आयात करें। यदि आपको इसे "स्क्रिप्ट करने योग्य" होने की आवश्यकता है - यानी आयात को उसी स्क्रिप्ट/लेनदेन में CREATE TABLE
कथन के रूप में होने की आवश्यकता है, तो इसके बजाय BULK INSERT का उपयोग करें। हालांकि BULK INSERT
एक गैर-लॉगऑन ऑपरेशन है, मान लीजिए या नहीं, इसे अभी भी BEGIN TRAN
/COMMIT TRAN
ब्लॉक में रखा जा सकता है।
आप सच में, सच, INSERT
एक लॉग इन आपरेशन होने के लिए, और बैचों में है, तो आप OPENROWSET उपयोग कर सकते हैं एक पाठ फ़ाइल को खोलने के लिए सम्मिलन हो नहीं करना चाहती चाहते हैं फ़ाइल एक्सेल, एक के रूप में आदि ad-hoc "table", और उसके बाद इसे अपनी नव निर्मित तालिका में डालें। मैं आमतौर पर OPENROWSET
के उपयोग की अनुशंसा करता हूं, लेकिन चूंकि यह स्पष्ट रूप से एक प्रशासनिक लिपि है, यह वास्तव में एक बड़ी समस्या नहीं है।
पिछला टिप्पणियों सुझाव है कि आप # 1 के साथ असहज कर रहे हैं, हालांकि यह सिर्फ एक गलत धारणा है कि यह एक एकल लेनदेन में नहीं किया जा सकता की वजह से हो सकता है, जिसमें मामले Thomas देख ' जवाब लेकिन अगर आप किसी अन्य तरीके से मरने के लिए तैयार हैं, तो मैं सुझाव देता हूं कि # 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
उम्मीद है कि इस सही रास्ते पर डाल मदद करता है। मुझे पूरा यकीन है कि यह आपके सभी उपलब्ध "बॉक्स में" विकल्पों को कवर करता है - इनके अलावा, आपको काम करने के लिए वास्तविक एप्लिकेशन प्रोग्राम या शैल स्क्रिप्ट लिखना शुरू करना होगा, और मुझे नहीं लगता कि जटिलता का स्तर है वास्तव में यहाँ वांछित।
संपादित होने तक, उसका मतलब है कि हर हज़ार डालने के बाद 'जाओ' कथन जोड़ना। –
धन्यवाद एलेक्स - सुझाए गए – Mark
के रूप में अपडेट किया गया है, मैंने समस्या को हल करने के लिए पहले से ही गो स्टेटमेंट का उपयोग किया है, लेकिन मैं बैच-निष्पादन का उपयोग नहीं करना चाहता क्योंकि अगर मुझे कोई त्रुटि है तो मुझे रोलबैकिंग लेनदेन में समस्या होगी ... – Tufo