连接SQL Server 2005的varchar(max)变量



当将几个@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

最新更新