我有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.但是当我把它们连成后,我失去了一些数据.
我怎样才能解决这个问题?
这个问题似乎与连接本身无关.
您可以使用此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个字符无论如何都会被截断.
其中一种解决方法是将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)