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 个字符
我有 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 个字符