所有,我都有一个大型(不可避免的)动态SQL查询。由于选择标准中字段的数量,包含动态SQL的字符串的长度超过4000个字符。现在,我知道为设置了最大4000 NVARCHAR(MAX),但是在Server Profiler中查看了已执行的SQL语句
NVARCHAR(MAX)
DELARE @SQL NVARCHAR(MAX); SET @SQL = 'SomeMassiveString > 4000 chars...'; EXEC(@SQL); GO
似乎可以正常工作(!?),对于另一个也很大的查询,它抛出与此4000极限(!?)相关的错误,它基本上会在此4000极限之后修剪所有SQL,并给我留下语法错误。尽管在探查器中有此设置,它仍以 完整 (!?)形式显示此动态SQL查询。
这里到底发生了什么,我应该将这个@SQL变量转换为VARCHAR并继续进行下去吗?
谢谢你的时间。
附言 能够打印出超过4000个字符以查看这些大查询也将是一件很不错的事情。以下仅限于4000
SELECT CONVERT(XML, @SQL); PRINT(@SQL);
还有其他很酷的方法吗?
我了解最大可设定4000 NVARCHAR(MAX)
您的理解是错误的。nvarchar(max)最多可以存储2GB(有时甚至超过2GB)的数据(10亿个双字节字符)。
nvarchar(max)
从联机丛书中的nchar和nvarchar来看,语法是
nvarchar [ ( n | max ) ]
该|字符的装置,这些替代品。即可以指定 任何 n或文字max。
|
n
max
如果选择指定一个特定值,n则该值必须在1到4,000之间,但使用时max将其定义为大对象数据类型(ntext不建议使用其替换)。
ntext
实际上,在SQL Server 2008中,对于一个 变量 ,似乎可以无限地超过2GB的限制,前提是其中有足够的空间tempdb
tempdb
关于您问题的其他部分
varchar(n) + varchar(n)
nvarchar(n) + nvarchar(n)
varchar(n) + nvarchar(n)
nvarchar
nvarchar(4,000)
[n]varchar(max)
varchar(max)
varchar(n)
nvarchar(n)
nvarchar(4000)
如果使用N前缀和该字符串是<=长4,000个字符它将被分类为nvarchar(n)其中n是串的长度。因此N'Foo'将被视为nvarchar(3)例如。如果字符串长度超过4,000个字符,则将被视为nvarchar(max)
N
N'Foo'
nvarchar(3)
如果不使用N前缀和字符串<= 8000个长字符将被分型为varchar(n)其中n是字符串的长度。如果更长varchar(max)
对于上述两种情况,如果字符串的长度为零,则将n其设置为1。
1. 该CONCAT功能在这里无济于事
CONCAT
DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000); SELECT DATALENGTH(@A5000 + @A5000), DATALENGTH(CONCAT(@A5000,@A5000));
对于两种串联方法,以上返回8000。
2. 注意+=
+=
DECLARE @A VARCHAR(MAX) = ''; SET @A+= REPLICATE('A',5000) + REPLICATE('A',5000) DECLARE @B VARCHAR(MAX) = ''; SET @B = @B + REPLICATE('A',5000) + REPLICATE('A',5000) SELECT DATALENGTH(@A), DATALENGTH(@B);`
退货
-------------------- -------------------- 8000 10000
注意@A遇到截断。
@A
由于将两个非max数据类型连接在一起,或者将varchar(4001 - 8000)字符串连接到nvarchar类型化的字符串(甚至是nvarchar(max)),您将被截断。
varchar(4001 - 8000)
为了避免第二个问题,只需确保所有字符串文字(或至少长度在4001-8000范围内的字符串文字)都以开头N。
为避免出现第一个问题,请从
DECLARE @SQL NVARCHAR(MAX); SET @SQL = 'Foo' + 'Bar' + ...;
到
DECLARE @SQL NVARCHAR(MAX) = ''; SET @SQL = @SQL + N'Foo' + N'Bar'
以便NVARCHAR(MAX)从一开始就将an包含在串联中(因为每个串联的结果也将是NVARCHAR(MAX)这种传播)
确保已选择“结果网格化”模式,然后可以使用
select @SQL as [processing-instruction(x)] FOR XML PATH聽
SSMS选项允许您设置XML结果的无限长度。该processing-instruction位避免出现字符(例如<显示为)的问题<。
XML
processing-instruction
<
<