在将多个@varchar(max)
变量连接在一起构建基于多个不同查询的电子邮件时,遇到了一个令人头疼的问题。
为了提高效率,我使用了几个varchars
来一次构建电子邮件,而不是通过大致相同的查询两次或三次或更多次来构建它只使用一个varchar
。< / p>
这很有效,直到我的varchars
超过8000个字符。然后将它们串联成一个varchar
(我可以推入@body
的{{1}}参数)返回“”,甚至LEN()实际上也不会给我一个长度
无论如何,我通过多次执行大致相同的查询并使用一个msdb.dbo.sp_send_dbmail
构建电子邮件来解决这个问题。
TL; DR
我对解决方案不满意。我怎么能将这些varchar(max)
变量相互追加?
答案 0 :(得分:5)
我过去曾经遇到的一件事可能会有所帮助,也可能没有帮助:SQL似乎“忘记”在连接varchar(max)时使用的数据类型。它不是维持MAX,而是转向传统的varcharnitude,意味着截断大约8000个字符。为了解决这个问题,我们使用以下技巧:
从
开始SET @MyMaxVarchar = @aVarcharMaxValue + @SomeString + @SomeOtherString + @etc
并像这样修改:
SET @MyMaxVarchar = cast(@aVarcharMaxValue as varchar(max)) + @SomeString + @SomeOtherString + @etc
同样,这可能对您的特定问题没有帮助,但记住它可能会让您在某一天出现重大问题。
答案 1 :(得分:0)
这可能不会发生在你的情况下,但是有一个&#34;陷阱&#34;嵌入在SQL Management Studio中涉及VARCHAR(MAX)
:SQL Studio只会输出结果网格中的这么多字符。你可以测试一下:
SELECT @MyLongVar, LEN(@MyLongVar)
您可能会发现返回的实际数据的长度(大多数文本编辑器可以为您提供此值)小于变量中存储的数据的长度。
修复工具在工具|中选项|查询结果| SQL Server |结果到网格;增加检索的最大字符数|非XML数据到一些非常大的数据。不幸的是,最大值是65,535,这可能还不够。
如果您的问题不涉及在SQL Studio中输出变量的值,请忽略。
答案 2 :(得分:0)
我发现MS SQL在尝试将字符串连接到NULL值时默默地执行NOTHING。因此这个解决方案总是对我有用:
UPDATE myTable
SET isNull(myCol, '') += 'my text'
WHERE myColumnID = 9999