SQL Server 2008 Nvarchar(Max)连接 - 截断问题

时间:2015-04-28 23:30:09

标签: sql-server tsql sqldatatypes nvarchar truncation

有人可以解释为什么会在SQL Server 2008上发生这种情况:

declare @sql Nvarchar(max);

set @sql =N'';

select @sql = @sql +replicate('a',4000) + replicate('b', 6000);

select len(@sql)

返回:8000

多个站点表明,只要第一个变量的类型为NVARCHAR(MAX),就不应该发生截断,但它仍然会发生截断。

2 个答案:

答案 0 :(得分:4)

因为'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)

这是Microsoft的REPLICATE功能信息的链接: https://msdn.microsoft.com/en-us/library/ms174383.aspx

在那里,它说:

  

如果string_expression的类型不是varchar(max)或nvarchar(max),则REPLICATE会将返回值截断为8,000字节。要返回大于8,000字节的值,必须将string_expression显式转换为适当的大值数据类型。

答案 1 :(得分:1)

至于为什么,我不知道。我只知道NVARCHAR喜欢在8000处切断,除非你把东西扔到NVARCHAR(MAX)或者你可以使用CONCAT():

UIViewController

两者都导致LEN(@sql)为10,000