जहां तक मैं बता सकता हूं कि 2008 में कोई ऊपरी सीमा नहीं है।
SQL Server 2005 में @GGMMsgचर के साथ असाइनमेंट पर आपके प्रश्न में कोड विफल रहता है
2,147,483,647 बाइट्स के अधिकतम अनुमत आकार से परे LOB बढ़ने का प्रयास।
नीचे दिए गए कोड के साथ विफल रहता है
REPLICATE: परिणाम की लंबाई लक्ष्य बड़े प्रकार की लंबाई सीमा (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 जीबी पर काम करता है जो जाहिर तौर पर कम या ज्यादा डबल है जो जरूरी प्रतीत होता है। मैं अनुमान लगाता हूं कि यह संभव है कि स्ट्रिंग कॉन्फेटेशन ऑपरेशन की अक्षमता के कारण पूरे विशाल स्ट्रिंग को कॉपी करने की जरूरत है और मौजूदा स्ट्रिंग के अंत में जोड़ने में सक्षम होने के बजाय अंत में एक चंक को जोड़ना होगा। दुर्भाग्य से इस समय .WRITEविधि varchar (अधिकतम) चर के लिए समर्थित नहीं है ।
इसके अलावा
मैंने भी समवर्ती 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)
DECLARE @y2 NVARCHAR(MAX) = REPLICATE(CAST('X' AS NVARCHAR(MAX)),1073741823);
SET @y2 = @y2 + @y2;
SELECT LEN(@y2), DATALENGTH(@y2)
DECLARE @y3 NVARCHAR(MAX) = @y2 + @y1
SELECT LEN(@y3), DATALENGTH(@y3)
SELECT @y1 y1, @y2 y2, @y3 y3
INTO Test
declare @x varchar(max) = 'XX'; SELECT LEN(REPLICATE(@x,2147483647))4294967294मेरे लिए देता है लेकिन दौड़ने में लंबा समय लेता है -SELECTवापस आने के बाद भी सुनिश्चित नहीं है कि अतिरिक्त समय क्या कर रहा है।