我有三个变量:
declare @A NVARCHAR(MAX), @B NVARCHAR(MAX), @C NVARCHAR(MAX)@A由40000个字符填充,@B填充50000个字符。
现在我想将@a和@b连接到@c中,如下所示:
@c = @a + @b并使用@c更新列。但当我与他们联系时,我会丢失一些数据。
我怎么才能解决这个问题?
发布于 2018-07-22 06:07:22
发布于 2018-07-21 20:29:07
问题似乎不在于连接本身。
您可以使用这个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;返回:
sizeA sizeB sizeC
----- ----- -----
40000 50000 90000而NVARCHAR(最大)最多可以包含2^30-1个字符.
所以1073741823个角色是..。很多。参考这里
即使这受到最大存储容量2G的限制。然后它仍然可以包含1000000000的2字节unicode字符.
换句话说,大约有3333.3本书,平均每本书有300000个字符。
许多图书馆可能会把它们所有的小说存储在一个NVARCHAR(MAX)中。
这个问题可能是由如何填充@A和/或@B引起的。
例如,如果您使用复制。
它只能填充多达4000个字符的NVARCHAR。
示例:
declare @X NVARCHAR(MAX);
set @X = replicate(N'X',10000);
select len(@X) as sizeX;返回:
sizeX
-----
4000所以有一个问题要问:
@A和/或@B是如何填充的,它们的数据长度是否与预期的一样?
如果@A或@B确实包含预期的字符数量?
但是,将单元格复制并粘贴到文本编辑器中并不能获得所有字符?
事实证明,只有多达43679个字符可以从具有非XML数据的单元格中复制到剪贴板中。
在SSMS的选项中,也存在对非Xml数据的限制。
见下面的截图。
因此,尝试复制和粘贴90000字符将被截断无论如何。

工作之一可能是将NVARCHAR(MAX)转换为选择中的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;https://stackoverflow.com/questions/51458994
复制相似问题