SQL Server 2008 Nvarchar(Max) 串联 - 截断问题
SQL Server 2008 Nvarchar(Max) concatenation - Truncation issue
谁能解释一下为什么 SQL Server 2008 会发生这种情况:
declare @sql Nvarchar(max);
set @sql =N'';
select @sql = @sql +replicate('a',4000) + replicate('b', 6000);
select len(@sql)
Returns: 8000
多个站点建议只要第一个变量是 NVARCHAR(MAX) 类型,就不应发生截断,但它仍然发生。
因为 'a'
和 'b'
不是 NVARCHAR(MAX)
类型
像这样,它应该可以工作:
declare @sql Nvarchar(max),
@a nvarchar(max),
@b nvarchar(max);
select @sql =N'', @a = N'a', @b = N'b';
select @sql = @sql +replicate(@a,4000) + replicate(@b, 6000);
select len(@sql)
这是link微软的REPLICATE函数信息:
https://msdn.microsoft.com/en-us/library/ms174383.aspx
在那里,它说:
If string_expression is not of type varchar(max) or nvarchar(max), REPLICATE truncates the return value at 8,000 bytes. To return values greater than 8,000 bytes, string_expression must be explicitly cast to the appropriate large-value data type.
至于为什么,我也不知道。我只知道 NVARCHAR 喜欢在 8000 处停止,除非你将东西投射到 NVARCHAR(MAX) 或者你可以使用 CONCAT():
DECLARE @sql Nvarchar(max);
SELECT @sql = CONCAT(@sql,replicate('a',4000),replicate('b', 6000)) --do it this way
--SELECT @sql = CAST(replicate('a',4000) AS NVARCHAR(MAX)) + CAST(replicate('b', 6000) AS NVARCHAR(MAX)) --or this way
两者都导致 LEN(@sql) 为 10,000
谁能解释一下为什么 SQL Server 2008 会发生这种情况:
declare @sql Nvarchar(max);
set @sql =N'';
select @sql = @sql +replicate('a',4000) + replicate('b', 6000);
select len(@sql)
Returns: 8000
多个站点建议只要第一个变量是 NVARCHAR(MAX) 类型,就不应发生截断,但它仍然发生。
因为 'a'
和 'b'
不是 NVARCHAR(MAX)
像这样,它应该可以工作:
declare @sql Nvarchar(max),
@a nvarchar(max),
@b nvarchar(max);
select @sql =N'', @a = N'a', @b = N'b';
select @sql = @sql +replicate(@a,4000) + replicate(@b, 6000);
select len(@sql)
这是link微软的REPLICATE函数信息: https://msdn.microsoft.com/en-us/library/ms174383.aspx
在那里,它说:
If string_expression is not of type varchar(max) or nvarchar(max), REPLICATE truncates the return value at 8,000 bytes. To return values greater than 8,000 bytes, string_expression must be explicitly cast to the appropriate large-value data type.
至于为什么,我也不知道。我只知道 NVARCHAR 喜欢在 8000 处停止,除非你将东西投射到 NVARCHAR(MAX) 或者你可以使用 CONCAT():
DECLARE @sql Nvarchar(max);
SELECT @sql = CONCAT(@sql,replicate('a',4000),replicate('b', 6000)) --do it this way
--SELECT @sql = CAST(replicate('a',4000) AS NVARCHAR(MAX)) + CAST(replicate('b', 6000) AS NVARCHAR(MAX)) --or this way
两者都导致 LEN(@sql) 为 10,000