You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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';

为什么之前会截断?

之前的问题主要是这几个原因:

  1. 你可能直接把单行查询结果赋值给@body,而没有合并所有行;
  2. 没设置@body_format='HTML',sp_send_dbmail会默认按纯文本处理,触发隐性的字符串长度限制;
  3. 如果用@query但没设置@query_result_width,默认宽度会导致长内容被截断。

内容的提问来源于stack exchange,提问作者Nicolaesse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:04:52