NVARCHAR(MAX) 的最大長度

本文使用的環境是SQL Server 2017, 主機是64位操做系統。sql

你們都知道,Micorosoft Docs對 max參數的定義是:max 指定最大的存儲空間是2GB,這個結論是正確的。數據庫

nvarchar [ ( n | max ) ]
Variable-size string data. n defines the string size in byte-pairs and can be a value from 1 through 4,000. max indicates that the maximum storage size is 2^30-1 characters (2 GB).函數

結論1:

當定義數據表的一個nvarchar(max)類型的數據列時,該類型存儲數據的最大空間是2GB。測試

當定義nvarchar(max)類型的變量時,該變量的最大空間是2GB。spa

結論2:

當定義一個nvarchar(max)類型的變量時,該變量的最大存儲空間是2GB,可是字符串函數可能不會達到多於8000B。作一個簡單的測試,調用replicate()函數,對一個Unicode 字符(佔2B)重複5000次,返回的字符串的最大長度是8000B:操作系統

print datalength(replicate(N'a',5000))

即便把replicate()函數返回的結果賦值給nvarchar(max)類型的變量,也是同樣;code

declare @txt nvarchar(max)
set @txt= replicate(N'a',5000)
print datalength(@txt)

結論3:

當定義一個nvarchar(max)類型的變量時,把多個nvarchar(max)類型的變量進行拼接,最大的存儲空間是2GB。orm

例如,下面的示例,輸出的結果是16000,這表明@cmd變量存儲的空間是16000B:blog

declare @cmd varchar(max)
set @cmd = 'print /*' + replicate ('-', 7990);
set @cmd = @cmd + replicate ('-', 7990) + '*/ getdate()';
exec (@cmd)
print datalength (@cmd)

對結論3的應用:執行動態SQL,TSQL腳本的最大字符數量是2GB

舉個例子,從數據庫中查詢全部數據表的結構,並獲取該列的一個樣本值:文檔

declare @sql nvarchar(max)

;with cte_table  as
(
    select s.name as table_schema
        ,o.name as table_name
        ,c.name as column_name
        ,t.name as data_type
    from sys.tables o
    inner join sys.schemas s
        on o.schema_id=s.schema_id
    inner join sys.columns c
        on o.object_id=c.object_id
    inner join sys.types t
        on c.user_type_id=t.user_type_id
)
select @sql=coalesce(@sql+N'union ',N'')+formatmessage(N'select top 1 table_name=''%s'',column_name=''%s'',data_type=''%s'',sample=cast(%s as nvarchar(max)) from %s'
        +nchar(10),table_name, column_name, data_type, column_name, table_schema + '.' + table_name)
from cte_table
where table_schema='xxx' 

print datalength(@sql)
print @sql

 

 

參考文檔:

相關文章
相關標籤/搜索