कोई प्रासंगिक हार्ड कोडित सीमा नहीं है (65,536 * 4KB का नेटवर्क पैकेट आकार 268 एमबी है और आपकी स्क्रिप्ट की लंबाई कहीं नहीं है) हालांकि बड़ी मात्रा में पंक्तियों के लिए इस पद्धति का उपयोग करना अनुचित है।
आप जो त्रुटि देख रहे हैं वह क्लाइंट टूल्स द्वारा SQL सर्वर नहीं है। यदि आप गतिशील SQL में SQL स्ट्रिंग का निर्माण करते हैं तो संकलन कम से कम सफलतापूर्वक प्रारंभ करने में सक्षम है
DECLARE @SQL NVARCHAR(MAX) = '(100,200,300),
';
SELECT @SQL = 'SELECT * FROM (VALUES ' + REPLICATE(@SQL, 1000000) + '
(100,200,300)) tc (proj_d, period_sid, val)';
SELECT @SQL AS [processing-instruction(x)]
FOR XML PATH('')
SELECT DATALENGTH(@SQL) / 1048576.0 AS [Length in MB] --30.517705917
EXEC(@SQL);
हालाँकि मैंने उपरोक्त को ~ 30 मिनट के संकलन समय के बाद मार दिया और इसने अभी भी एक पंक्ति का उत्पादन नहीं किया था। शाब्दिक मूल्यों को योजना के अंदर ही स्थिरांक की तालिका के रूप में संग्रहीत करने की आवश्यकता होती है और SQL सर्वर खर्च करता है बहुत समय उनके बारे में भी संपत्तियां निकालने का प्रयास कर रहे हैं।
SSMS एक 32 बिट अनुप्रयोग है और एक std::bad_alloc
फेंकता है बैच को पार्स करते समय अपवाद
यह एक तत्व को टोकन के एक वेक्टर पर धकेलने की कोशिश करता है जो क्षमता तक पहुँच गया है और स्मृति के एक बड़े पर्याप्त सन्निहित क्षेत्र की अनुपलब्धता के कारण इसका आकार बदलने का प्रयास विफल हो जाता है। तो बयान कभी भी इसे सर्वर तक नहीं बनाता है।
वेक्टर क्षमता हर बार 50% बढ़ती है (अर्थात यहां अनुक्रम का पालन करते हुए ) वेक्टर को बढ़ने की क्षमता इस बात पर निर्भर करती है कि कोड कैसे निर्धारित किया जाता है।
निम्नलिखित को 19 की क्षमता से 28 तक बढ़ने की जरूरत है।
SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)
और निम्नलिखित को केवल 2 के आकार की आवश्यकता है
SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)
निम्नलिखित को> 63 और <=94 की क्षमता की आवश्यकता है।
SELECT *
FROM (VALUES
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300)
) tc (proj_d, period_sid, val)
एक लाख पंक्तियों के लिए, जैसा कि 1 के मामले में है, वेक्टर क्षमता को बढ़ाकर 3,543,306 करने की आवश्यकता है।
आप पा सकते हैं कि निम्न में से कोई भी क्लाइंट साइड पार्सिंग को सफल होने देगा।
- लाइन ब्रेक की संख्या कम करें।
- एसएसएमएस को इस उम्मीद में फिर से शुरू करना कि बड़ी सन्निहित मेमोरी के लिए अनुरोध सफल हो जाता है जब कम पता स्थान विखंडन होता है।
हालाँकि, भले ही आप इसे सफलतापूर्वक सर्वर पर भेजते हैं, यह केवल निष्पादन योजना निर्माण के दौरान सर्वर को समाप्त कर देगा, जैसा कि ऊपर चर्चा की गई है।
आप तालिका लोड करने के लिए आयात निर्यात विज़ार्ड का उपयोग करने से बहुत बेहतर होंगे। यदि आपको इसे टीएसक्यूएल में करना है, तो आप इसे छोटे बैचों में तोड़ते हुए पाएंगे और/या किसी अन्य विधि का उपयोग कर सकते हैं जैसे कि एक्सएमएल को श्रेड करना टेबल वैल्यूड कंस्ट्रक्टर्स से बेहतर प्रदर्शन करेगा। निम्नलिखित उदाहरण के लिए मेरी मशीन पर 13 सेकंड में निष्पादित होता है (हालांकि यदि एसएसएमएस का उपयोग कर रहे हैं तो आपको एक बड़े एक्सएमएल स्ट्रिंग अक्षर को चिपकाने के बजाय कई बैचों में तोड़ना होगा)।
DECLARE @S NVARCHAR(MAX) = '<x proj_d="100" period_sid="200" val="300" />
' ;
DECLARE @Xml XML = REPLICATE(@S,1000000);
SELECT
x.value('@proj_d','int'),
x.value('@period_sid','int'),
x.value('@val','int')
FROM @Xml.nodes('/x') c(x)