SQL Server concat

1 sql sql-server concat

我有3个变量:

declare @A NVARCHAR(MAX), @B NVARCHAR(MAX), @C NVARCHAR(MAX)
Run Code Online (Sandbox Code Playgroud)

@A填充40000个字符,@B填充50000.

现在我想Concat的@a@b@c这样:

@c = @a + @b
Run Code Online (Sandbox Code Playgroud)

并使用更新列@c.但是当我把它们连成后,我失去了一些数据.

我怎样才能解决这个问题?

Luk*_*rms 5

这个问题似乎与连接本身无关.

您可以使用此SQL代码段对其进行测试:

declare @A NVARCHAR(MAX), @B NVARCHAR(MAX), @C NVARCHAR(MAX);
set @A = replicate(N'A',4000);
set @A = @A + @A + @A + @A + @A;
set @A = @A + @A;
set @B = replicate(N'B',2500);
set @B = @B + @B + @B + @B + @B;
set @B = @B + @B;
set @B = @B + @B;

-- CONCAT(@A,@B) gives the same result as @A+@B. 
-- But @A+@B would return NULL if @A or @B is NULL.
set @C = CONCAT(@A, @B);

select len(@A) as sizeA, len(@B) as sizeB, len(@C) as sizeC;
Run Code Online (Sandbox Code Playgroud)

退货:

sizeA   sizeB   sizeC
-----   -----   -----
40000   50000   90000
Run Code Online (Sandbox Code Playgroud)

NVARCHAR(MAX)最多可包含2 ^ 30-1个字符.
所以1073741823字符是...很多.参考此处
即使受限于最大存储容量2 GB.然后它仍然可以包含1000000000个2字节的unicode字符.
换句话说,大约3333.3本书,每本书平均有300000个字符.
许多图书馆可能将他们的所有小说都存储在一个NVARCHAR(MAX)中.

问题可能是由于@A和/或@B被填满的原因造成的.

例如,如果您使用REPLICATE.
它只能用最多4000个字符填充NVARCHAR.

例:

declare @X NVARCHAR(MAX);
set @X = replicate(N'X',10000);
select len(@X) as sizeX;
Run Code Online (Sandbox Code Playgroud)

返回:

sizeX
-----
4000
Run Code Online (Sandbox Code Playgroud)

所以要问的一个问题是:

@A和/或@B是如何填满的,它们的数据长度是否符合预期?

如果@A或@B确实包含预期的字符数量?
但是将单元格复制并粘贴到文本编辑器并没有获得所有字符?

事实证明,只有43679个字符可以从具有非XML数据的单元格复制到剪贴板中.
并且SSMS的OPTIONS中的非Xml数据也有限制.
见下面的截图.
所以尝试复制和粘贴90000个字符无论如何都会被截断.

ssms网格选项

其中一种解决方法是将NVARCHAR(MAX)转换为select中的XML类型.由于XML具有默认的2MB限制.

示例代码段:

declare @X NVARCHAR(MAX);
set @X = replicate(N'0123456789',333); -- 3330
set @X = @X + @X + @X + @X + @X; -- 16650
set @X = @X + @X + @X + @X; -- 66600

select len(@X) as sizeX, cast(N'<X><![CDATA['+ @X +N']]></X>' as XML) as XasXml;
Run Code Online (Sandbox Code Playgroud)