核心組件:
1. Database Mail – 基於 SMTP 的郵件發送子系統 (需先啟用 Service Broker)。
2. 預存程序 – 封裝業務邏輯、組裝 HTML 郵件內容、呼叫 msdb.dbo.sp_send_dbmail。
3. SQL Server Agent 作業 – 排程觸發預存程序,實現定時自動發送。
CREATE PROCEDURE dbo.sp_send_repayment_alert
AS
BEGIN
SET NOCOUNT ON;
DECLARE @mail_body NVARCHAR(MAX) = N'';
DECLARE @subject NVARCHAR(200) = N'每日異常還款監控報表 - ' + CONVERT(VARCHAR(10), GETDATE(), 120);
DECLARE @profile NVARCHAR(128) = N'DB_Mail_Profile'; -- 對應設定檔名稱
-- 1. 以游標逐筆組裝 HTML 表格列 (示範用,實務建議改用 FOR XML PATH)
DECLARE @br_id VARCHAR(50), @installments VARCHAR(10), @remark VARCHAR(200);
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT br_id, installments, remark
FROM dw_account_repayment
WHERE status <> 1 AND is_del = 0
ORDER BY add_datetime DESC;
OPEN cur;
FETCH NEXT FROM cur INTO @br_id, @installments, @remark;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @mail_body += N'' + @br_id + N' ' + @installments + N' ' + @remark + N' ';
FETCH NEXT FROM cur INTO @br_id, @installments, @remark;
END
CLOSE cur; DEALLOCATE cur;
-- 2. 若有資料則發送
IF LEN(@mail_body) > 0
BEGIN
SET @mail_body = N'自動還款異常清單
標ID 期數 錯誤描述 '
+ @mail_body + N'
';
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @profile,
@recipients = N'alert@example.com;dba@example.com',
@subject = @subject,
@body = @mail_body,
@body_format = 'HTML',
@importance = 'HIGH';
END
END
GO
SELECT @mail_body = (
SELECT
td = br_id, '',
td = installments,'',
td = remark, ''
FROM dw_account_repayment
WHERE status <> 1 AND is_del = 0
ORDER BY add_datetime DESC
FOR XML PATH('tr'), TYPE
).value('.', 'NVARCHAR(MAX)');
單陳述式產生所有 <tr>,避免游標循環開銷,大幅提升大數據量下組裝速度。
EXEC dbo.sp_send_repayment_alert;,資料庫選 msdb 或業務庫。| 現象 | 排查方向 |
|---|---|
| 郵件卡在 unsent | 檢查 msdb.dbo.sysmail_log、Service Broker 是否啟用、SMTP 連通性 |
| 收件者未收到 | 垃圾郵件箱、SMTP 伺服器發送限制、@recipients 格式 (分號分隔) |
| 中文亂碼 | 確認 @body 為 NVARCHAR、資料庫定序支援 Unicode、郵件主旨編碼 |
「預存程序 + Database Mail + Agent 作業」是 SQL Server 內建的輕量級自動化通知方案,無需外部排程器即可實現可靠的定時郵件發送。善用 FOR XML PATH 優化內容組裝,配合完善的錯誤日誌監控,能構建穩健的營運通知體系。