使用sp_send_dbmail发送全表HTML邮件仅显示一行的问题求助
解决SQL Server邮件中HTML表格仅显示一行的问题
看起来你的问题主要出在HTML表格的结构错误,以及变量初始化的小细节上,导致邮件客户端无法正确渲染完整表格。下面是具体的问题分析和修正后的代码:
问题点分析
- 嵌套的
<table>标签:你在拼接@rpt时连续写了两个<table>标签,这会导致HTML结构混乱,浏览器/邮件客户端无法正确解析多行数据。 - 表头行结构错误:第二组
<th>标签没有被包裹在<tr>里,破坏了表格的行结构,这是导致仅显示一行的核心原因。 - 变量未显式初始化:虽然
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>< 2 sec</th> <th>> 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"改成
< 2 sec,"5 sec"改成> 5 sec,符合HTML转义规范的同时,语义更清晰。
内容的提问来源于stack exchange,提问作者Mahesh Patewar
相关产品推荐
相关产品推荐

