Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Kích thước tối đa của một biến varchar (max)

Theo như tôi có thể nói thì không có giới hạn trên trong năm 2008.

Trong SQL Server 2005, mã trong câu hỏi của bạn không thành công khi gán cho @GGMMsg biến với

Cố gắng tăng LOB vượt quá kích thước tối đa cho phép là 2.147.483.647byte.

mã bên dưới không thành công với

REPLICATE:Độ dài của kết quả vượt quá giới hạn độ dài (2GB) của loại lớn mục tiêu.

Tuy nhiên, có vẻ như những hạn chế này đã lặng lẽ được dỡ bỏ. Vào năm 2008

DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681); 

SET @y = REPLICATE(@y,92681);

SELECT LEN(@y) 

Trả lại

8589767761

Tôi đã chạy điều này trên máy tính để bàn 32 bit của mình nên chuỗi 8GB này vượt quá bộ nhớ có thể định địa chỉ

Đang chạy

select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid

Đã trả lại

internal_objects_alloc_page_co 
------------------------------ 
2144456    

vì vậy tôi cho rằng tất cả điều này chỉ được lưu trữ trong LOB các trang trong tempdb không có xác nhận về độ dài. Tăng số lượng trang đều được liên kết với SET @y = REPLICATE(@y,92681); tuyên bố. Phép gán biến ban đầu cho @yLEN tính toán đã không làm tăng điều này.

Lý do đề cập đến điều này là vì số lượng trang nhiều hơn tôi mong đợi. Giả sử một trang 8KB thì điều này hoạt động ở 16,36 GB, rõ ràng là nhiều hơn hoặc ít hơn gấp đôi so với những gì có vẻ là cần thiết. Tôi suy đoán rằng điều này có thể là do hoạt động nối chuỗi không hiệu quả, cần sao chép toàn bộ chuỗi lớn và nối một đoạn vào cuối thay vì có thể thêm vào cuối chuỗi hiện có. Rất tiếc tại thời điểm này, .WRITE phương thức không được hỗ trợ cho các biến varchar (max).

Bổ sung

Tôi cũng đã kiểm tra hành vi với việc nối nvarchar(max) + nvarchar(max)nvarchar(max) + varchar(max) . Cả hai điều này đều cho phép vượt quá giới hạn 2GB. Tuy nhiên, cố gắng lưu trữ kết quả của điều này trong một bảng thì không thành công với thông báo lỗi Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes. lần nữa. Tập lệnh cho điều đó ở bên dưới (có thể mất nhiều thời gian để chạy).

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. 11 cách lấy khóa chính trong SQL Server (ví dụ T-SQL)

  2. Làm thế nào để thực hiện một GROUP BY phân biệt chữ hoa chữ thường?

  3. Bảo trì theo lịch trình của Cơ sở dữ liệu IS 24/7 trong MS SQL Server

  4. Kết nối MSSQL CodeIgniter

  5. Lỗi máy chủ SQL - HRESULT E_FAIL đã được trả về từ một cuộc gọi đến thành phần COM