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

SQL Server定时HTML邮件:空临时表显示无数据实现方案

实现SQL Server动态HTML邮件:空临时表时显示"No Data"

当然可行!感谢@SeanLange帮你明确了问题方向,咱们直接解决核心需求:当临时表#TempTable1有数据时展示表内容,无数据时显示No Data提示,同时保证代码正常运行并发送邮件。下面给你两种常用的实现方式,你可以根据场景选择:

方法一:用IF EXISTS分支处理(逻辑清晰,易维护)

这种方式先检查临时表是否有数据,再分别生成不同的HTML片段,适合需要给两种场景添加不同样式或额外逻辑的情况:

-- 1. 先创建测试用临时表(实际场景替换成你的业务逻辑)
CREATE TABLE #TempTable1 (col1 NVARCHAR(50), col2 NVARCHAR(50))
-- 测试时可以注释/打开下面的插入语句,模拟有数据/无数据的情况
-- INSERT INTO #TempTable1 VALUES ('数据1', '内容A'), ('数据2', '内容B')

DECLARE @HtmlContent NVARCHAR(MAX)

-- 2. 判断临时表是否有数据,生成对应HTML
IF EXISTS(SELECT * FROM #TempTable1)
BEGIN
    -- 有数据时生成带表格的HTML
    SET @HtmlContent = N'
    <html>
    <body>
        <h3>每日调度数据</h3>
        <table border="1" cellpadding="5">
            <tr><th>列1</th><th>列2</th></tr>
            ' + CAST((
                SELECT td = col1, '', td = col2
                FROM #TempTable1 
                ORDER BY col1
                FOR XML PATH('tr'), TYPE
            ) AS NVARCHAR(MAX)) + N'
        </table>
    </body>
    </html>'
END
ELSE
BEGIN
    -- 无数据时显示提示文本,还可以自定义样式
    SET @HtmlContent = N'
    <html>
    <body>
        <h3>每日调度数据</h3>
        <p style="color:#666; font-size:16px; padding:20px; border:1px dashed #ccc;">No Data</p>
    </body>
    </html>'
END

-- 3. 发送邮件(替换成你的邮件配置信息)
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = '你的邮件配置文件名',
    @recipients = '收件人邮箱@xxx.com',
    @subject = '每日调度数据报告',
    @body = @HtmlContent,
    @body_format = 'HTML'

-- 清理临时表
DROP TABLE #TempTable1

方法二:用UNION ALL+COUNT的巧妙写法(代码更紧凑)

如果只是简单的表格展示需求,也可以用一条SQL语句生成HTML,通过判断临时表行数动态切换内容:

-- 1. 创建测试临时表
CREATE TABLE #TempTable1 (col1 NVARCHAR(50), col2 NVARCHAR(50))
-- INSERT INTO #TempTable1 VALUES ('数据1', '内容A'), ('数据2', '内容B')

DECLARE @HtmlContent NVARCHAR(MAX)

SET @HtmlContent = N'
<html>
<body>
    <h3>每日调度数据</h3>
    <table border="1" cellpadding="5">
        <tr><th>列1</th><th>列2</th></tr>
        ' + CAST((
            -- 核心逻辑:临时表有数据取真实内容,无数据则插入提示行
            SELECT 
                td = CASE WHEN COUNT(*) OVER() = 0 THEN 'No Data' ELSE col1 END,
                '',
                td = CASE WHEN COUNT(*) OVER() = 0 THEN '' ELSE col2 END
            FROM #TempTable1
            -- 当临时表为空时,添加一行默认提示
            UNION ALL
            SELECT 'No Data', ''
            WHERE NOT EXISTS(SELECT * FROM #TempTable1)
            -- 确保提示行排在最后(如果有真实数据的话)
            ORDER BY CASE WHEN col1 = 'No Data' THEN 1 ELSE 0 END, col1
            FOR XML PATH('tr'), TYPE
        ) AS NVARCHAR(MAX)) + N'
    </table>
</body>
</html>'

-- 发送邮件
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = '你的邮件配置文件名',
    @recipients = '收件人邮箱@xxx.com',
    @subject = '每日调度数据报告',
    @body = @HtmlContent,
    @body_format = 'HTML'

DROP TABLE #TempTable1

关键细节说明:

  • 方法一的优势是逻辑拆分清晰,后续如果要给两种场景加不同的头部、尾部样式或额外业务逻辑,修改起来更直观;
  • 方法二用UNION ALL和NOT EXISTS动态拼接内容,代码更简洁,适合简单的表格展示场景;
  • 生成XML时,FOR XML PATH('tr'), TYPE会自动把每个td标签包裹在<tr>里,''用来分隔不同的td,避免内容被直接拼接在一起。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:57:48