我有3个变量:
declare @A NVARCHAR(MAX), @B NVARCHAR(MAX), @C NVARCHAR(MAX)
@A
填充40000个字符,@B
填充50000。
现在,我想像这样将@a
和@b
合并到@c
中:
@c = @a + @b
并使用@c
更新一列。但是当我连接它们时,我会丢失一些数据。
我该如何解决?
答案 0 :(得分: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;
返回:
sizeA sizeB sizeC
----- ----- -----
40000 50000 90000
并且NVARCHAR(MAX)最多可以包含2 ^ 30-1个字符。
所以1073741823个字符是...很多。参考here
即使受到最大2 GB的存储空间的限制。那么它仍然可以包含1000000000个2字节的unicode字符。
换句话说,大约有3333.3本书,每本书平均300000个字符。
许多图书馆可能会将所有小说都存储在一个NVARCHAR(MAX)中。
问题可能是由@A和/或@B的填充方式引起的。
例如,如果您要使用REPLICATE。
NVARCHAR最多只能填充4000个字符。
示例:
declare @X NVARCHAR(MAX);
set @X = replicate(N'X',10000);
select len(@X) as sizeX;
返回:
sizeX
-----
4000
所以要问的一个问题是:
@A和/或@B如何填充,其数据长度是否符合预期?
如果@A或@B是否包含预期的字符数?
但是,将单元格复制粘贴到文本编辑器中并没有得到所有字符吗?
事实证明,最多只能将具有非XML数据的单元格中的43679个字符复制到剪贴板中。
SSMS的OPTIONS中对Non-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;
答案 1 :(得分:0)
Can't insert more than 43679 character to sql server single cell?
它很有用
弄清楚我保存的数据是否完整,但SSMS-在网格模式下不能从列中粘贴超过43679个字符