SQL Server:字符串串联的句柄



给定一个变量 nvarchar(max),输入是 'aaaaa...'长度为16000。变量的值在此设置中没有问题。

如果我将输入分解为 3 个较小的输入,假设 (7964,4594,3442),变量会截断它们的串联。

另一方面,如果至少有 1 个变量的大小超过 8000,则串联工作没有问题。

是否有关于上述行为的任何文档?

摘自文档:

如果字符串串联的结果超过 8,000 字节,结果将被截断。但是,如果至少有一个 串联的字符串是较大的值类型,不会发生截断。

varchar 和 nvarchar 之间的操作分别限制为 8000 和 4000 个字符,除非您将任何涉及的数据类型视为 MAX 。请非常谨慎地处理操作顺序,这是文档中一个非常好的例子:

DECLARE @x varchar(8000) = replicate('x', 8000)
DECLARE @y varchar(max) = replicate('y', 8000)
DECLARE @z varchar(8000) = replicate('z',8000)
SET @y = @x + @z + @y
-- The result of following select is 16000
SELECT len(@y) AS y

结果是 16k 而不是 24k,因为第一个操作是@x + @z在 8000 处被截断,因为它们都不MAX。然后将结果连接到一个MAX的类型,从而打破了 8000 作为限制的限制,这又增加了 @y 的 8000 个字符。结果,变量 @z 中的字符在第一次串联时丢失。

如果您使用 CONCAT 函数

如果没有任何输入参数具有受支持的大型对象 (LOB) 类型,则返回类型截断长度为 8000 个字符, 无论返回类型如何。此截断可保留空间和 支持计划生成效率。

尝试

CONCAT(CAST('' as VARCHAR(MAX)),@var1,@var2)

CAST(@var1 as VARCHAR(MAX)) + @var2

最新更新