我了解最大可设定4000 NVARCHAR(MAX)
您的理解是错误的。nvarchar(max)
最多可以存储2GB(有时甚至超过2GB)的数据(10亿个双字节字符)。
从NCHAR和nvarchar联机丛书中的语法
nvarchar [ ( n | max ) ]
该|
字符的装置,这些替代品。即可以指定任何 n
或文字max
。
如果选择指定一个特定值,n
则该值必须介于1到4,000之间,但使用时max
将其定义为大对象数据类型(ntext
不建议使用其替换)。
实际上,在SQL Server 2008中,对于一个变量,似乎可以无限地超过2GB的限制,前提是其中有足够的空间tempdb
(如此处所示)
关于问题的其他部分
连接时的截断取决于数据类型。
varchar(n) + varchar(n)
将截断为8,000个字符。
nvarchar(n) + nvarchar(n)
将截断为4,000个字符。
varchar(n) + nvarchar(n)
将截断为4,000个字符。nvarchar
具有较高的优先级,因此结果是nvarchar(4,000)
[n]varchar(max)
+ [n]varchar(max)
不会截断(<2GB)。
varchar(max)
+ varchar(n)
不会截断(<2GB),结果将键入为varchar(max)
。
varchar(max)
+ nvarchar(n)
不会截断(<2GB),结果将键入为nvarchar(max)
。
nvarchar(max)
+ varchar(n)
将首先将varchar(n)
输入转换为nvarchar(n)
,然后进行串联。如果varchar(n)
字符串的长度 大于4,000个字符,则将nvarchar(4000)
强制转换并将截断。
字符串文字的数据类型
如果您使用N
前缀,并且字符串的长度小于等于4,000个字符,则将在nvarchar(n)
其中键入n
字符串的长度。因此N'Foo'
将被视为nvarchar(3)
例如。如果字符串长度超过4,000个字符,则将被视为nvarchar(max)
如果不使用N
前缀和字符串<= 8000个长字符将被分型为varchar(n)
其中n
是字符串的长度。如果更长varchar(max)
对于上述两种情况,如果字符串的长度为零,则将n
其设置为1。
较新的语法元素。
1.该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
遇到截断。
如何解决您遇到的问题。
由于将两个非max
数据类型连接在一起或由于将varchar(4001 - 8000)
字符串连接到nvarchar
类型化的字符串(甚至是nvarchar(max)
),您将被截断。
为避免第二个问题,只需确保所有字符串文字(或至少长度在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
位避免出现字符(例如<
显示为)的问题<
。