使用sp_send_dbmail发送HTML邮件时行被截断至256字符的问题
嘿,这个256字符截断的坑我之前也踩过!问题根源在于你直接把临时表的单行内容塞给@body,或者没正确处理多行HTML的拼接,导致SQL Server默认的字符串限制把内容砍了。下面给你两个靠谱的解决方案,亲测有效:
方案1:手动拼接完整HTML字符串(最可控)
首先把临时表中所有行的HTML内容合并成一个完整的NVARCHAR(MAX)字符串,这样就不会有单行截断的问题了。
如果你用的是SQL Server 2017及以上版本(支持STRING_AGG):
-- 先拼接所有HTML行成完整字符串 DECLARE @FullHTML NVARCHAR(MAX); SELECT @FullHTML = STRING_AGG(HTML_body, '') WITHIN GROUP (ORDER BY RowNum) FROM ##HTML_BODY; -- 发送邮件,务必加上@body_format='HTML' EXEC msdb.dbo.sp_send_dbmail @profile_name = 'ProfileMail', @recipients = 'me@mycompanydomain.domain', @subject = 'MySubject', @body = @FullHTML, @body_format = 'HTML';
低版本SQL Server(2016及以下):
用累加的方式拼接:
DECLARE @FullHTML NVARCHAR(MAX) = ''; SELECT @FullHTML = @FullHTML + HTML_body FROM ##HTML_BODY ORDER BY RowNum; -- 靠行号保证顺序正确 EXEC msdb.dbo.sp_send_dbmail @profile_name = 'ProfileMail', @recipients = 'me@mycompanydomain.domain', @subject = 'MySubject', @body = @FullHTML, @body_format = 'HTML';
注意:建议给临时表加个自增行号列(比如
RowNum INT IDENTITY(1,1)),这样拼接时能严格保证样式、表头、数据的顺序,不然HTML结构会乱掉。
方案2:直接用@query参数让sp_send_dbmail处理查询结果
如果你不想手动拼接,可以让sp_send_dbmail直接执行查询获取HTML内容,关键是要设置参数避免截断:
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'ProfileMail', @recipients = 'me@mycompanydomain.domain', @subject = 'MySubject', @query = 'SELECT HTML_body FROM ##HTML_BODY ORDER BY RowNum;', @query_result_header = 0, -- 关掉查询结果的表头,不然会多出一行破坏HTML @query_result_width = 32767, -- 设置最大宽度,防止内容被截断 @body_format = 'HTML';
为什么之前会截断?
之前的问题主要是这几个原因:
- 你可能直接把单行查询结果赋值给
@body,而没有合并所有行; - 没设置
@body_format='HTML',sp_send_dbmail会默认按纯文本处理,触发隐性的字符串长度限制; - 如果用
@query但没设置@query_result_width,默认宽度会导致长内容被截断。
内容的提问来源于stack exchange,提问作者Nicolaesse
相关产品推荐
相关产品推荐

