zoukankan      html  css  js  c++  java
  • NVARCHAR(MAX) 的最大长度

    本文使用的环境是SQL Server 2017, 主机是64位操作系统。

    大家都知道,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。

    结论2:

    当定义一个nvarchar(max)类型的变量时,该变量的最大存储空间是2GB。但是有些字符串函数处理的结果可能不会多于8000B,做一个简单的测试,调用replicate()函数,对一个Unicode 字符(占2B)重复5000次,返回的字符串的最大长度是8000B,即使多次拼接也不能突破8000B的限制:

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

    即使把replicate()函数返回的结果赋值给nvarchar(max)类型的变量,也不突破8000B的限制。

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

    结论3:

    当定义一个nvarchar(max)类型的变量时,把多个nvarchar(max)类型的变量进行拼接,最大的存储空间是2GB。

    例如,下面的示例,输出的结果是16000,这代表@cmd变量存储的空间是16000B:

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

    对结论3的应用:执行动态SQL,传递的TSQL脚本的最大字符数量是2GB

    举个例子,从数据库中查询所有数据表的结构,并获取每一列的一个样本值,可以考虑使用动态SQL

    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

     

     

    参考文档:

  • 相关阅读:
    《DSP using MATLAB》Problem 6.17
    一些老物件
    《DSP using MATLAB》Problem 6.16
    《DSP using MATLAB》Problem 6.15
    《DSP using MATLAB》Problem 6.14
    《DSP using MATLAB》Problem 6.13
    《DSP using MATLAB》Problem 6.12
    《DSP using MATLAB》Problem 6.11
    P1414 又是毕业季II
    Trie树
  • 原文地址:https://www.cnblogs.com/ljhdo/p/11983708.html
Copyright © 2011-2022 走看看