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 更新一列。但是当我连接它们时,我丢失了一些数据。

我该如何解决这个问题?

问题似乎不在于连接本身。

您可以使用此 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;

Returns :

sizeA   sizeB   sizeC
-----   -----   -----
40000   50000   90000

一个 NVARCHAR(MAX) 最多可以包含 2^30-1 个字符。
所以 1073741823 个字符是......很多。参考here
即使这受到 2 GB 的最大存储大小的限制。那么它仍然可以包含 1000000000 个 2 字节的 unicode 字符。
也就是说,大约3333.3本平均每本书300000字的书。
许多图书馆可能会将他们所有的小说存储在一个 NVARCHAR(MAX) 中。

问题可能是@A and/or @B 的填充方式引起的。

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

示例:

declare @X NVARCHAR(MAX);
set @X = replicate(N'X',10000);
select len(@X) as sizeX;

Returns:

sizeX
-----
4000

所以要问的一个问题是:

How were @A and/or @B filled up, and is the length of their data as expected?

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

事实证明,最多只能将 43679 个字符从非 XML 数据的单元格复制到剪贴板。
SSMS 的选项中的非 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;

Can't insert more than 43679 character to sql server single cell?

很有用

确定我的数据已完全保存,但 SSMS - 无法从网格模式的列中粘贴超过 43679 个字符