在SQL Server 2005中使用VARCHAR(MAX)和字符串连接

Mat*_*tio 4 t-sql sql-server-2005

我们其中一个数据库的用户正在尝试向SQL Server 2005数据库提交UPDATE查询,并且文本意外被截断.

被截断的字段是VARBINARY(MAX),用于存储HTML文本.

查询大致是:

UPDATE Story 
SET mainText = CONVERT (VARBINARY (MAX), '[...5000 chars of text...]' 
    + char(47) + char(47)
    + '[...3000 chars of text...]'
    + char(47) + char(47)
    + '[...5000 chars of text...]') 
WHERE storyId = 123456
Run Code Online (Sandbox Code Playgroud)

我在一些实验后发现的是,当我删除字符串连接时,查询按预期工作,并且字段不会被截断.

我能够通过将每个单独的字符串包装在CAST到VARCHAR(MAX)中来解决限制并保持连接,因此如果用户觉得需要使用char(),则有一个选项.

认为,无论何时使用连接运算符,都会发生VARCHAR的隐式转换,并且隐式转换似乎仅限于VARCHAR(8000)而不是VARCHAR(MAX).因此,在将字符串发送到CONVERT函数之前,它已经被截断为8000个字符.

如果我是对的,有没有办法改变这种行为?

如果没有办法改变行为,除了CAST之外还有另一种方法可以解决这个问题吗?

gbn*_*gbn 11

你需要先拿字符串第一.

CONVERT (VARBINARY (MAX), '[...5000 chars of text...]')
    + char(47) + char(47)
    + '[...3000 chars of text...]'
    + char(47) + char(47)
    + '[...5000 chars of text...]'
Run Code Online (Sandbox Code Playgroud)

之前,内部文本永远不会超过8000字节.那你就是CASting.太晚了.

'[...5000 chars of text...]') 
    + char(47) + char(47)
    + '[...3000 chars of text...]'
    + char(47) + char(47)
    + '[...5000 chars of text...]' 
Run Code Online (Sandbox Code Playgroud)

有关"为什么"的更完整的演练,请在此处查看我的答案"对于Nvarchar(Max)我在TSQL中只获得4000个字符?"