本文使用的环境是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_typefrom sys.tables oinner join sys.schemas son o.schema_id=s.schema_idinner join sys.columns con o.object_id=c.object_idinner join sys.types ton 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

参考文档:

NVARCHAR(MAX) 的最大长度相关推荐

  1. nvarchar(max) mysql_sql中nvarchar(max)长度测试

    nvarchar(max)长度测试:在使用convert强制类型转化之后 文本长度可以突破8000的上限. 并且nvarchar(max)的最大长度可达到2^31 以下为验证SQL: Declare ...

  2. sql中NVARCHAR(MAX) 性能和占空间分析 varchar(n),nvarchar(n) 长度性能及所占空间分析

    sql中NVARCHAR(MAX) 性能和占空间分析 varchar(n),nvarchar(n) 长度性能及所占空间分析 观此文描述较为全面,故此转载.原地址: sql中NVARCHAR(MAX) ...

  3. 关于varchar(max), nvarchar(max)和varbinary(max)

    在MS SQL2005及以上的版本中,加入大值数据类型(varchar(max).nvarchar(max).varbinary(max) ).大值数据类型最多可以存储2^30-1个字节的数据. 这几 ...

  4. SQL Server 2005 的nvarchar(max),varchar(max)来救火

    今天处理组织架构部分的代码出错了,还好数据库迁移到了SQL Server 2005,原来系统使用的是SQL Server 2000,随着公司规模的扩大,公司人员的急速增长,系统不断的发生了问题,经常在 ...

  5. SQL Server 2005中NTEXT与NVARCHAR(MAX)

    NTEXT: 默认情况下,NTEXT将文本数据存储在LOB结构中, 在表结构中只存储指针,指针指向该数据在LOB中的存储位置. NVARCHAR(MAX) 默认情况下,不超过8,000字节的数据直接存 ...

  6. 使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据类型代替text、ntext 和 image 数据类型...

    Microsoft SQL Server 2005 中引入了 max 说明符.此说明符增强了 varchar.nvarchar 和 varbinary 数据类型的存储能力.varchar(max).n ...

  7. nvarchar(max)和表扫描

    刚才有同事问我一个他觉得很奇怪的现象,一个表有30多G的数据,他使用一句简单的SQL语句查询表中的一行数据,执行计划显示数据库使用了聚集索引扫描,但执行时间只有0.3秒,为什么扫描30G的数据只需要0 ...

  8. java nvarchar max_sql server中使用nvarchar(MAX)代替ntext

    两个字段目前来说存储的数据没什么大区别但是nvarchar(MAX)类型查询的时候方便一些,ntext查询的时候还得转换类型. 比如: ntex类型:select * from 表 where con ...

  9. 了解SQLServer中varchar(max)、nvarchar(max)和varbinary(max)

    了解SQLServer中varchar(max).nvarchar(max)和varbinary(max) 转载于:http://www.poorren.com/sqlserver-2005-varc ...

最新文章

  1. 程序员转型人工智能工程师,如何在百忙之中不走岔路
  2. Facebook Messenger要点燃聊天机器人革命,据说四月就发布!
  3. java arraylist 对象 删除_ArrayList实现删除重复元素(元素不是对象类型的情况)...
  4. java------线程同步方法
  5. 【Php】最最简单的php环境搭建
  6. error PRJ0003 : 生成“cl.exe”时出错 解决方案
  7. python简介pdf_Py之pdfkit:python的库之pdfkit简介、安装、使用方法详细攻略
  8. 【学术篇】SDOI2008 仪仗队
  9. Cakephp 创建无模型的Controller
  10. 修改element-ui 下拉框样式
  11. 服务器固态硬盘和普通硬盘的区别
  12. 使用C++开发的NES(FC)模拟器
  13. kali linux 入侵教程,kali linux 入侵wordpress! wpscan工具使用方法!
  14. python中nums[:]和nums
  15. Android热修复Tinker原理分析
  16. 补第十一次课作业(法律法规、标准规范、职业道德)
  17. jQuery手风琴菜单的制作
  18. mosquitto分析
  19. pikachu XSS Cross-Site Scripting(皮卡丘漏洞平台通关系列)
  20. 前端UI:element-ui,ant-design-vue

热门文章

  1. 公众号写作——经验分享
  2. Unity 修改材质球的属性为透明
  3. LINUX的基本操作学习总结
  4. django分页器Paginator的基本使用
  5. 洛谷:P1331 海战(BFS)
  6. 红宝书阅读笔记(持续更新)
  7. Android项目中配置gradle自动上传蒲公英
  8. 怎么可以在网上赚钱,互联网老手告诉你这些经验!
  9. Windows 10分辨率怎么设置?
  10. 华为Mate40系列上市时间:10月30日,订金预定已开始