เท่าที่ฉันสามารถบอกได้ว่าไม่มีขีด จำกัด สูงสุดในปี 2008
ใน SQL Server 2005 รหัสในคำถามของคุณล้มเหลวในการกำหนดให้กับ@GGMMsg
ตัวแปรด้วย
พยายามที่จะขยาย LOB เกินขนาดสูงสุดที่อนุญาตคือ 2,147,483,647 ไบต์
รหัสด้านล่างล้มเหลวด้วย
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 GB ซึ่งเห็นได้ชัดว่าสิ่งที่ดูเหมือนจะจำเป็นมากหรือน้อยกว่าสองเท่า ฉันคาดเดาว่าสิ่งนี้น่าจะเกิดจากความไม่มีประสิทธิภาพของการดำเนินการต่อสตริงที่จำเป็นต้องคัดลอกสตริงขนาดใหญ่ทั้งหมดและต่อท้ายส่วนท้ายแทนที่จะสามารถเพิ่มลงในส่วนท้ายของสตริงที่มีอยู่ได้ ขออภัยในขณะนี้.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
จะกลับมาแล้วก็เลยไม่แน่ใจว่าจะใช้เวลาเพิ่มไปทำอะไร