当将几个@varchar(max)
变量连接在一起以基于几个不同的查询构建电子邮件时,遇到了一个令人头疼的问题。
为了提高效率,我同时使用了几个varchars
来构建电子邮件,而不是只使用一个varchar
来构建大致相同的查询两三次或更多次。
这一直有效,直到我的varchars
超过8000个字符。然后,将它们连接到一个varchar
中(我可以将其插入msdb.dbo.sp_send_dbmail
的@body
参数中)返回",甚至连LEN()实际上都不会给我一个长度。
无论如何,我已经通过多次执行大致相同的查询并只使用一个varchar(max)
构建电子邮件来解决这个问题。
TL;DR
我对这个解决方案不满意。我怎么能把这些varchar(max)
变量相互附加?
我过去遇到过一件事,这可能有帮助,也可能没有帮助:当连接varchar(max)时,SQL似乎"忘记"了它使用的数据类型。它没有维护MAX,而是转换为传统的varcharnitude,即8000个字符左右的截断
从开始
SET @MyMaxVarchar = @aVarcharMaxValue + @SomeString + @SomeOtherString + @etc
并这样修改:
SET @MyMaxVarchar = cast(@aVarcharMaxValue as varchar(max)) + @SomeString + @SomeOtherString + @etc
同样,这可能对你的特定问题没有帮助,但记住它可能会让你在未来的某一天不再头疼。
在您的案例中可能没有发生这种情况,但SQL Management Studio中嵌入了一个涉及VARCHAR(MAX)
的"gotcha":SQL Studio只会在结果网格中输出这么多字符。你可以测试这个:
SELECT @MyLongVar, LEN(@MyLongVar)
您可能会发现返回的实际数据的长度(大多数文本编辑器都可以提供)小于存储在变量中的数据的长度。
修复程序位于"工具"|"选项"|"查询结果"|"SQL Server"|"网格结果"中;将"检索的最大字符数|非XML数据"增加到某个非常大的数字。不幸的是,最大值是65535,这可能还不够。
如果您的问题不涉及在SQL Studio中输出变量的值,请忽略。
我发现,当试图将字符串连接到NULL值时,MS SQL不会做任何事情。因此,这个解决方案总是适用于我:
UPDATE myTable
SET isNull(myCol, '') += 'my text'
WHERE myColumnID = 9999