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

使用sp_send_dbmail发送全表HTML邮件仅显示一行的问题求助

解决SQL Server邮件中HTML表格仅显示一行的问题

看起来你的问题主要出在HTML表格的结构错误,以及变量初始化的小细节上,导致邮件客户端无法正确渲染完整表格。下面是具体的问题分析和修正后的代码:

问题点分析

  1. 嵌套的<table>标签:你在拼接@rpt时连续写了两个<table>标签,这会导致HTML结构混乱,浏览器/邮件客户端无法正确解析多行数据。
  2. 表头行结构错误:第二组<th>标签没有被包裹在<tr>里,破坏了表格的行结构,这是导致仅显示一行的核心原因。
  3. 变量未显式初始化:虽然COALESCE能处理NULL,但显式初始化@str1为空字符串能避免潜在的拼接异常,让逻辑更可靠。

修正后的完整代码

-- 显式初始化拼接变量,避免NULL导致的拼接问题
DECLARE @str1 NVARCHAR(MAX) = '';
DECLARE @rpt NVARCHAR(MAX);

-- 拼接表格数据行
SELECT @str1 = @str1 + '<tr>
    <td align="right">' + CONVERT(NVARCHAR(30), CURRENT_DTM, 109) + '</td>
    <td align="right">' + ISNULL(CONVERT(NVARCHAR(30), MIN_START_DTM, 109), '0') + '</td>
    <td align="right">' + ISNULL(CONVERT(NVARCHAR(30), MAX_END_DTM, 109), '0') + '</td>
    <td align="left">' + SERVER + '</td>
    <td align="right">' + CONVERT(NVARCHAR(20), REPLACE(CONVERT(VARCHAR, CONVERT(MONEY, TXN_CNT_LAST_HR), 1), '.00', '')) + '</td>
    <td align="right">' + CONVERT(NVARCHAR(20), REPLACE(CONVERT(VARCHAR, CONVERT(MONEY, AVG_RESPONSE_LAST_HR), 1), '.00', '')) + '</td>
    <td align="right">' + ISNULL(CONVERT(NVARCHAR(20), TXN_Less_2_SEC), '0') + '</td>
    <td align="right">' + ISNULL(CONVERT(NVARCHAR(20), TXN_GRTR_5_SEC), '0') + '</td>
    <td align="right">' + ISNULL(CONVERT(NVARCHAR(20), TXN_GR_2sec_LS_5_SEC), '0') + '</td>
</tr>' 
FROM ##Report 
ORDER BY SERVER, TXN_CNT_LAST_HR;

-- 处理无数据的情况,colspan匹配表格总列数
SET @str1 = ISNULL(@str1, '<tr><td colspan="9">No records to show</td></tr>');

-- 修正HTML表格结构:移除嵌套table,修复表头行
SET @rpt = N'<table border="1">' + 
           N'<tr><th colspan="5">Txn = Transaction, Resp = Response Time</th><th colspan="4">Txn count with Resp time range</th></tr>' + -- 5+4=9,匹配数据列总数
           N'<tr>
               <th>Current Timestamp</th>
               <th>Min Timestamp</th>
               <th>Max Timestamp</th>
               <th>Server</th>
               <th>Txn Count</th>
               <th>Avg Resp (seconds)</th>
               <th>&lt; 2 sec</th>
               <th>&gt; 5 sec</th>
               <th>2 to 5 sec</th>
             </tr>' + 
           @str1 + 
           N'</table>';

-- 发送邮件
EXEC msdb.dbo.sp_send_dbmail 
    @profile_name='MainMail', 
    @recipients = 'mspatewar007@gmail.com',
    @subject = 'Report', 
    @body = @rpt, 
    @body_format = 'HTML';

额外优化说明

  • 调整了表头的colspan:原来的5+3=8,但你的数据行实际有9列,改成5+4=9后,表头和数据列能完美匹配。
  • 把ISNULL(..., 0)改成ISNULL(..., '0'):避免日期/字符串类型和数字拼接时的隐式转换错误,用字符串'0'更安全。
  • 格式化了代码换行:让HTML结构更易读,方便后续维护。
  • 优化表头语义:把"2 sec"改成&lt; 2 sec,"5 sec"改成&gt; 5 sec,符合HTML转义规范的同时,语义更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:38:18