जहां तक मेरा बता सकते हैं 2008 में
कोई ऊपरी सीमा SQL सर्वर 2005 में अपने प्रश्न में कोड
प्रयास कर रहा है के साथ @GGMMsg
चर करने के लिए काम पर विफल रहता है में है 2,147,483,647 बाइट्स के अधिकतम स्वीकृत आकार से अधिक LOB को बढ़ाने के लिए। नीचे
कोड के साथ
को दोहराने में विफल रहता है: परिणाम की लंबाई लक्ष्य बड़े आकार की लंबाई सीमा (2GB) से अधिक है।
हालांकि ऐसा लगता है कि इन सीमाओं को चुपचाप हटा लिया गया है।2008 को
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
रिटर्न
8589767761
मैं अपने 32 बिट डेस्कटॉप मशीन पर इस भाग गया तो यह 8GB स्ट्रिंग चल रहा है
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
लौटाया गया पता स्मृति
से अधिक तरीका है
internal_objects_alloc_page_co
------------------------------
2144456
इसलिए मुझे लगता है कि यह LOB
पृष्ठों में tempdb
में संग्रहीत हो जाता है, लंबाई के बिना कोई सत्यापन नहीं। पेज गिनती वृद्धि SET @y = REPLICATE(@y,92681);
कथन से जुड़ी हुई थी। प्रारंभिक परिवर्तनीय असाइनमेंट @y
और LEN
गणना में वृद्धि नहीं हुई।
इसका उल्लेख करने का कारण यह है क्योंकि पृष्ठ की गणना मुझे अपेक्षा से अधिक है। एक 8 केबी पेज मानते हुए यह 16.36 जीबी पर काम करता है जो स्पष्ट रूप से आवश्यक होता है जो कम या ज्यादा दोगुना होता है। मैं अनुमान लगाता हूं कि यह स्ट्रिंग कॉन्सटेनेशन ऑपरेशन की अक्षमता के कारण पूरे विशाल स्ट्रिंग की प्रतिलिपि बनाने की आवश्यकता है और मौजूदा स्ट्रिंग के अंत में जोड़ने में सक्षम होने के बजाय अंत में एक खंड को जोड़ना है। दुर्भाग्य से इस समय .WRITE
वर्चर (अधिकतम) चर के लिए isn't supported विधि।
अलावा
मैं भी nvarchar(max) + nvarchar(max)
और nvarchar(max) + varchar(max)
श्रृंखलाबद्ध साथ व्यवहार परीक्षण किया है। इनमें से दोनों 2 जीबी सीमा पार होने की अनुमति देते हैं। इसके बाद किसी तालिका में इसके परिणामों को संग्रहीत करने का प्रयास करने के बाद त्रुटि संदेश Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
फिर से विफल हो जाता है। इसके लिए स्क्रिप्ट नीचे है (चलाने में लंबा समय लग सकता है)।
DECLARE @y1 VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),2147483647);
SET @y1 = @y1 + @y1;
SELECT LEN(@y1), DATALENGTH(@y1) /*4294967294, 4294967292*/
DECLARE @y2 NVARCHAR(MAX) = REPLICATE(CAST('X' AS NVARCHAR(MAX)),1073741823);
SET @y2 = @y2 + @y2;
SELECT LEN(@y2), DATALENGTH(@y2) /*2147483646, 4294967292*/
DECLARE @y3 NVARCHAR(MAX) = @y2 + @y1
SELECT LEN(@y3), DATALENGTH(@y3) /*6442450940, 12884901880*/
/*This attempt fails*/
SELECT @y1 y1, @y2 y2, @y3 y3
INTO Test
'घोषणा @x वर्कर (अधिकतम) = 'एक्सएक्स'; चयन करें लेंस (उत्तर दें (@ x, 2147483647)) 'मेरे लिए '42 9 4 9 672 9 4' देता है लेकिन 'चयन' वापस आने के बाद भी चलाने में लंबा समय लगता है, इसलिए यह सुनिश्चित न करें कि उस अतिरिक्त समय में क्या खर्च किया जा रहा है। –