有人可以解释为什么会在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),就不应该发生截断,但它仍然会发生截断。
答案 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