SQL Server 內建 Database Mail 功能支援發送 HTML 格式郵件,可直接將查詢結果轉為精美表格嵌入郵件本文。本文提供完整實作範例,涵蓋動態 HTML 表格產生、條件式發送、郵件設定檔配置與中文編碼處理。
完整實作腳本
DECLARE @tableHTML NVARCHAR(MAX);
DECLARE @d_nowdate DATETIME;
DECLARE @str_subject NVARCHAR(200);
DECLARE @i_result INT;
-- 取得前一日日期 (統計基準日)
SET @d_nowdate = CONVERT(DATETIME, CONVERT(VARCHAR(10), DATEADD(DAY, -1, GETDATE()), 120), 120);
-- 僅當有資料時發送
IF EXISTS (SELECT TOP 1 * FROM t_table1 (NOLOCK) WHERE d_rq = @d_nowdate)
BEGIN
-- 郵件主旨
SET @str_subject = N'某某' + CONVERT(VARCHAR(10), @d_nowdate, 120) + N'淨值.';
-- 動態建構 HTML 表格
SET @tableHTML = N'某某
目前測試中
' +
N'| 日期 | 基金代碼 | 基金名稱 | 淨值 | 累計淨值 |
' +
CAST((
SELECT
CONVERT(VARCHAR(10), @d_nowdate, 120) AS 'td', '',
VC_JJDM AS 'td', '',
Vc_jjmc AS 'td', '',
EN_JJDWJZ AS 'td', '',
EN_LJJZ AS 'td'
FROM t_table1 t
LEFT JOIN t_table2 tt ON t.VC_JJDM = tt.C_FUNDCODE
WHERE d_rq = @d_nowdate
ORDER BY Vc_jjmc, VC_JJDM
FOR XML PATH('tr'), ELEMENTS
) AS NVARCHAR(MAX)) +
N'
';
-- 發送郵件
EXEC @i_result = msdb.dbo.sp_send_dbmail
@profile_name = 'Profile-Mail',
@recipients = N'郵箱1;郵箱2;郵箱3',
@subject = @str_subject,
@body = @tableHTML,
@body_format = 'HTML';
-- 可檢查 @i_result 判斷發送結果
END
關鍵技術點解析
1. FOR XML PATH('tr') 產生表格列
ELEMENTS 選項將每個欄位包裹在 <td> 標籤中。
- 欄位別名指定為
'td' 並穿插空字串 '',確保每欄獨立成 <td>。
2. sp_send_dbmail 核心參數
| 參數 | 說明 |
| @profile_name | Database Mail 設定檔名稱 (需預先在 SSMS 配置) |
| @recipients | 收件者,分號分隔多地址 |
| @body_format | 'HTML' 或 'TEXT',決定本文解析方式 |
| @importance | 可選:'HIGH'、'NORMAL'、'LOW' |
| @attach_query_result_as_file | 可選:將查詢結果另存為附件 |
3. 中文編碼處理
- 變數宣告使用
NVARCHAR 儲存 Unicode 內容。
- HTML 標籤字串前加
N 前綴:N'中文
'。
- 資料庫欄位若為
VARCHAR 存中文,查詢時建議 CAST(欄位 AS NVARCHAR(MAX)) 避免亂碼。
郵件呈現效果
收件者將看到格式化的 HTML 表格:
| 日期 | 基金代碼 | 基金名稱 | 淨值 | 累計淨值 |
| 2013-12-20 | 111111 | AAAAA | 0.98300000 | 0.98300000 |
| 2013-12-20 | 222222 | BBBBB | 1.04900000 | 1.04900000 |
進階擴充建議
- 加入 CSS 樣式:在
@tableHTML 開頭嵌入 <style> 美化表格。
- 附件模式:
@attach_query_result_as_file = 1, @query_attachment_filename = 'Report.csv'。
- 錯誤處理:檢查
@i_result 非 0 時記錄失敗原因 (msdb.dbo.sysmail_event_log)。
- 排程自動化:建立 SQL Agent Job 定時執行此腳本。
善用 sp_send_dbmail 搭配 FOR XML PATH,能將資料庫直接轉化為自動化報表郵件中樞,零程式碼部署即時資訊觸達。
- 上一篇文章: SQL Server 6 大實用自訂函數:提取數字/英文/中文、過濾重複字元、字串分割
- 下一篇文章: SQL Server 監控磁碟 I/O 錯誤:msdb.dbo.suspect_pages 完整解析與維護指南
Copyright ©
程式碼之家 All Rights Reserved