SQL Server concat

SQL Server concat,sql,sql-server,concat,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代码段对其进行测试: 返回: NVARCHAR(最大值)最多可包含2^30-1个字符。 所以10737

我有3个变量:

declare @A NVARCHAR(MAX), @B NVARCHAR(MAX), @C NVARCHAR(MAX)
@A
用40000个字符填充,
@B
用50000个字符填充

现在我想把
@a
@b
转换成
@c
,如下所示:

@c = @a + @b
并使用
@c
更新列。但是当我发现它们时,我丢失了一些数据


我怎样才能解决这个问题?

问题似乎不在于混凝土本身

您可以使用以下SQL代码段对其进行测试:

返回:

NVARCHAR(最大值)最多可包含2^30-1个字符。
所以1073741823个字符是。。。很多参考文献
即使这受到最大存储容量2G字节的限制。然后它仍然可以包含100000000个2字节unicode字符。
换句话说,大约有3333.3本书,平均每本书有300000个字符。
许多图书馆可能将他们所有的小说储存在一个NVARCHAR(MAX)中

问题可能是由@A和/或@B的填充方式引起的

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

示例:

返回:

所以要问的一个问题是:

@A和/或@B是如何填写的,他们的数据长度是否如预期的那样

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

事实证明,从包含非XML数据的单元格中最多只能将43679个字符复制到剪贴板中。
SSMS选项中的非Xml数据也有这一限制。
请参见下面的屏幕截图。
因此,尝试复制和粘贴90000个字符将被截断

解决方法之一是将NVARCHAR(MAX)强制转换为select中的XML类型。因为XML有默认的2MB限制

示例代码片段:

声明@X NVARCHAR(最大值);
设置@X=replicate(N'0123456789',333);--3330
设置@X=@X+@X+@X+@X+@X;——16650
设置@X=@X+@X+@X+@X;——66600
选择len(@X)作为sizeX,cast(N''作为XML)作为XasXml;

问题似乎不在浓缩本身

您可以使用以下SQL代码段对其进行测试:

返回:

NVARCHAR(最大值)最多可包含2^30-1个字符。
所以1073741823个字符是。。。很多参考文献
即使这受到最大存储容量2G字节的限制。然后它仍然可以包含100000000个2字节unicode字符。
换句话说,大约有3333.3本书,平均每本书有300000个字符。
许多图书馆可能将他们所有的小说储存在一个NVARCHAR(MAX)中

问题可能是由@A和/或@B的填充方式引起的

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

示例:

返回:

所以要问的一个问题是:

@A和/或@B是如何填写的,他们的数据长度是否如预期的那样

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

事实证明,从包含非XML数据的单元格中最多只能将43679个字符复制到剪贴板中。
SSMS选项中的非Xml数据也有这一限制。
请参见下面的屏幕截图。
因此,尝试复制和粘贴90000个字符将被截断

解决方法之一是将NVARCHAR(MAX)强制转换为select中的XML类型。因为XML有默认的2MB限制

示例代码片段:

声明@X NVARCHAR(最大值);
设置@X=replicate(N'0123456789',333);--3330
设置@X=@X+@X+@X+@X+@X;——16650
设置@X=@X+@X+@X+@X;——66600
选择len(@X)作为sizeX,cast(N''作为XML)作为XasXml;

它是有用的

计算我保存的数据是否完整,但SSMS-在网格模式下无法从列中粘贴超过43679个字符

它是有用的


计算出我的数据保存的完整性,但SSMS-在网格模式下无法从列中粘贴超过43679个字符

共享代码/tsql,您有问题,因此我们将能够提供帮助。您是否尝试使用
CONCAT
而不是
+
?插入或连接时是否丢失数据?您能通过显示所有三个变量的LEN()来重现错误吗?我尝试了CONCAT,但在CONCAT中丢失了数据,可能是您在显示方面有问题。可以提供帮助。共享您遇到问题的代码/tsql,以便我们能够提供帮助。您是否尝试使用
CONCAT
而不是
+
?您是否丢失了插入或连接的数据?您能通过显示所有三个变量的LEN()来重现错误吗?我尝试了CONCAT,但在CONCAT中丢失了数据,可能是您在显示方面有问题。可以提供帮助。很好的捕获,我(愚蠢地)假设
REPLICATE
的值大于它可以处理的值时会抱怨,但是,这是一个documentrd“功能”:@Larnu你是对的。很好的发现。。“特征”。8000个字符是在使用VARCHAR时使用的。因为它是每个字符1字节。使用NVARCHAR时,如果只有2字节unicode字符,则少于4000个字符。我希望这篇文章能揭示他是如何填充变量的。也许他的问题的根源有一个简单的解决办法。很好,我(愚蠢地)假设
REPLICATE
的值大于它所能处理的值时会抱怨,但是,这是一个documentrd“功能”:@Larnu你是对的。很好的发现。。“特征”。8000个字符是在使用VARCHAR时使用的。因为它是每个字符1字节。使用NVARCHAR时,如果只有2字节unicode字符,则少于4000个字符。我希望这篇文章能揭示他是如何填充变量的。也许他的问题的根源有一个简单的解决办法
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
declare @X NVARCHAR(MAX);
set @X = replicate(N'X',10000);
select len(@X) as sizeX;
sizeX
-----
4000
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;