3

@varchar(max)在将几个变量连接在一起以基于几个不同的查询构建电子邮件时遇到了一个非常令人头疼的问题。

为了提高效率,我一次使用多个varchars来构建电子邮件,而不是通过大致相同的查询两次或三次或更多次以仅使用一个来构建它varchar

这一直有效,直到我varchars的字符数超过 8000 个。然后将它们全部连接成一个varchar(我可以将其塞入 的@body参数中msdb.dbo.sp_send_dbmail)返回“”,甚至 LEN() 实际上也不会给我一个长度。

无论如何,我通过多次执行大致相同的查询并仅使用一个varchar(max).

TL;博士

我对解决方案不满意。我怎么能将这些varchar(max)变量相互附加?

4

3 回答 3

5

我过去遇到的一件事在这里可能有帮助,也可能没有帮助:当你连接 varchar(max) 时,SQL 似乎“忘记”了它使用的数据类型。它没有保留 MAX,而是转而使用传统的 varcharnitude,这意味着在 8000 个字符左右截断。为了解决这个问题,我们使用以下技巧:

从...开始

SET @MyMaxVarchar = @aVarcharMaxValue + @SomeString + @SomeOtherString + @etc

并像这样修改:

SET @MyMaxVarchar = cast(@aVarcharMaxValue as varchar(max)) + @SomeString + @SomeOtherString + @etc

同样,这可能对您的特定问题没有帮助,但记住它可能会在某天为您节省大麻烦。

于 2012-01-26T21:22:03.563 回答
0

在您的情况下可能没有发生这种情况,但是 SQL Management Studio 中嵌入了一个“陷阱”,涉及VARCHAR(MAX):SQL Studio 只会在结果网格中输出这么多字符。您可以对此进行测试:

SELECT @MyLongVar, LEN(@MyLongVar)

您可能会发现返回的实际数据的长度(大多数文本编辑器都可以为您提供)小于存储在变量中的数据的长度。

修复在工具 | 选项 | 查询结果 | SQL 服务器 | 结果到网格;增加检索到的最大字符数| 非 XML 数据到一些非常大的数量。不幸的是,最大值为 65,535,这可能还不够。

如果您的问题不涉及在 SQL Studio 中输出变量的值,请忽略。

于 2015-02-25T23:29:58.457 回答
0

我发现 MS SQL 在尝试将字符串连接到 NULL 值时会默默地做任何事情。因此这个解决方案总是对我有用:

UPDATE myTable
   SET isNull(myCol, '') += 'my text'
 WHERE myColumnID = 9999
于 2016-06-28T15:30:15.733 回答