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