जहाँ तक मैं बता सकता हूँ 2008 में कोई ऊपरी सीमा नहीं है।
SQL सर्वर 2005 में आपके प्रश्न का कोड @GGMMsg
को असाइनमेंट पर विफल हो जाता है
LOB को 2,147,483,647bytes के अधिकतम अनुमत आकार से आगे बढ़ाने का प्रयास किया जा रहा है।
नीचे दिया गया कोड
. के साथ विफल रहता है <ब्लॉकक्वॉट>प्रतिकृति:परिणाम की लंबाई लक्ष्य बड़े प्रकार की लंबाई सीमा (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
गणना ने इसे नहीं बढ़ाया।
इसका उल्लेख करने का कारण यह है कि पृष्ठ संख्या मेरी अपेक्षा से बहुत अधिक है। एक 8KB पृष्ठ मान लें तो यह 16.36 GB पर काम करता है जो स्पष्ट रूप से कमोबेश दोगुना है जो आवश्यक प्रतीत होता है। मैं अनुमान लगाता हूं कि स्ट्रिंग कॉन्सटेनेशन ऑपरेशन की अक्षमता के कारण यह संभव है कि मौजूदा स्ट्रिंग के अंत में जोड़ने में सक्षम होने के बजाय पूरे विशाल स्ट्रिंग की प्रतिलिपि बनाने और अंत में एक हिस्सा जोड़ने की आवश्यकता हो। दुर्भाग्य से इस समय .WRITE
विधि varchar(max) चर के लिए समर्थित नहीं है।
जोड़
मैंने nvarchar(max) + nvarchar(max)
को जोड़ने के साथ व्यवहार का भी परीक्षण किया है और nvarchar(max) + varchar(max)
. ये दोनों 2GB की सीमा को पार करने की अनुमति देते हैं। इसके बाद इसके परिणामों को एक तालिका में संग्रहीत करने का प्रयास विफल हो जाता है, हालांकि त्रुटि संदेश 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