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

参考文档:

原文地址:https://www.cnblogs.com/ljhdo/p/11983708.html

时间: 2024-11-02 12:58:49

NVARCHAR(MAX) 的最大长度的相关文章

sql中nvarchar(max)长度测试

nvarchar(max)长度测试:在使用convert强制类型转化之后 文本长度可以突破8000的上限.并且nvarchar(max)的最大长度可达到2^31以下为验证SQL: Declare @A nvarchar(max) set @A=replicate('*',9000); print len(@A) set @A=replicate(CONVERT(nvarchar(max),'*'),9000); print len(@A) set @A=replicate(CONVERT(nva

C#操作Nvarchar(max)

和操作一般nvarchar一样,要注意的一点就是SqlDbType.Nvarchar的长度设置为-1, new SqlParameter("@text",SqlDbType.NVarChar,-1) public bool AddMax() { StringBuilder strSql = new StringBuilder(); strSql.Append("insert into tb_MaxTest("); strSql.Append("id,tex

SQL Server中nvarchar(max)

SQL Server中,存储较小的数据,可以使用varchar(n).nvarchar(n) 和 varbinary(n)类型,存储大的数据,使用varchar(max).nvarchar(max)和varbinary(max) 代替 text.ntext 和 image 数据类型. 其中 varchar(max) 代替 text;nvarchar(max) 代替 ntext;varbinary(max) 代替 image NTEXT与NVARCHAR(MAX)的区别 NTEXT 默认情况下,N

nhibernate 配置nvarchar(max)

若你真的需要一个nvarchar(max)的sql存储空间时,记得增加 .CustomType("StringClob") Demo:Map(x => x.ContentManifest).CustomType("StringClob").CustomSqlType("nvarchar(max)"); Map(x => x.ContentManifest).lenght(10000); 这两种方式都行 尽管只用CustomSqlTyp

char、varchar和nvarchar的区别

首先char.varchar和nvarchar.text.ntext都是数据库中的文本数据类型,再区分区分var前缀.n前缀的区别.而text.ntext已经普遍被varchar(MAX)和nvarchar(MAX)所替代,所以一般不使用. char 表示不可变长度,如果赋的值不够指定位数,则末尾使用空格补齐. varchar 表示可变长度,如果赋的值不够指定位数,以实际赋的值为准. nvarchar n前缀表示的是unicode编码标准.如果是带n的,则每个字符占2个字节.如果不带n的,则英文

使用 bcp 指定数据文件中的前缀长度

使用 bcp 指定数据文件中的前缀长度 当以本机格式将数据大容量导出到数据文件时,为使文件存储空间最为紧凑,bcp 命令将在每个字段前面使用一个或多个字符来指示字段的长度. 这些字符称为"长度前缀字符". bcp 的前缀长度提示 如果某个交互式 bcp 命令包含不带格式化文件开关 (-f) 或数据格式开关(-n.-c.-w 或 -N)的 in 或 out 选项,则该命令会提示输入每个数据字段的前缀长度,如下所示: Enter prefix length of field <fie

oracle中varchar、varchar2、char和nvarchar的区别

1.char char的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节: char是区分中英文的,中文在char中占两个字节,而英文占一个,所以char(20)你只能存20个字母或10个汉字. char适用于长度比较固定的,一般不含中文的情况 2.varchar/varchar2 varchar是长度不固定的,比如说,你定义了varchar(20),当你插入abc,则在数据库中只占3个字节. varc

SQL Server中char、varchar、text和nchar、nvarchar、ntext的区别 (转)

转:http://blog.csdn.net/jackychu/article/details/4183118 http://www.cnblogs.com/jhxk/articles/1633578.html 很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大手一挥 一把人民币就从他手里溜走了,其实我想不管是做人也好,做开发也好,细节的把握直接决

MSSql中ntext与nvarchar相等比较

在MS Sql数据库中,如果table中的某column数据类型设计为ntext或者text,做查询匹配时,用=操作会引起: The data types ntext and varchar are incompatible in the equal to operator. 因为 用‘’引起来的字符串默认的数据类型为nvarchar,ntext类型的数据与nvarcahr类型数据不能直接做比较. 比如,如下一个查询: select * from myTable where myColumnOn