Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

वर्चर (अधिकतम) चर का अधिकतम आकार

जहाँ तक मैं बता सकता हूँ 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UTF8 स्ट्रिंग के MD5 हैश की गणना करें

  2. मैं SQL सर्वर में एकल उद्धरण से कैसे बचूँ?

  3. SQL सर्वर प्रबंधन स्टूडियो (SSMS) में अलग टैब में क्वेरी और परिणाम कैसे प्रदर्शित करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 15

  4. जावा से एसक्यूएल सर्वर संग्रहीत प्रक्रिया में टेबल-मूल्यवान पैरामीटर कैसे पास करें?

  5. कैसे जांचें कि एसक्यूएल सर्वर में कोई बाधा मौजूद है या नहीं?