SQL Server连接

时间:2018-07-21 18:31:23

标签: sql sql-server concat

我有3个变量:

declare @A NVARCHAR(MAX), @B NVARCHAR(MAX), @C NVARCHAR(MAX)

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

现在,我想像这样将@a@b合并到@c中:

@c = @a + @b

并使用@c更新一列。但是当我连接它们时,我会丢失一些数据。

我该如何解决?

2 个答案:

答案 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个字符将被截断。

ssms grid options

一种解决方法是在选择中将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个字符