B2B 專案需求:老闆每天想看新訂單,但不想登入後台,希望透過 Email 收到格式優美的 HTML 報表。本文示範使用 SSIS 2008 + VS 2008 實作完整流程。
FOR XML AUTO, ELEMENTS, TYPE, ROOT 產生結構化 XMLSendMailPackage.dtsx建立 F:\SSIS_Example\SendMail\ 放置:
QueryOrder.sql - 查詢腳本Orders.xsl - XSLT 樣式表Orders.htm - 輸出 HTML 檔/* 實際使用時將 @v_CurrentDate 換成 GETDATE() */
DECLARE @v_CurrentDate DATETIME
SET @v_CurrentDate = '2003-07-17' -- 測試固定日期
IF EXISTS (
SELECT 1 FROM Sales.SalesOrderHeader
WHERE OrderDate = @v_CurrentDate
)
BEGIN
SELECT TOP 10
oh.OrderDate,
(SELECT ROUND(SUM(TotalDue), 2)
FROM Sales.SalesOrderHeader
WHERE OrderDate = @v_CurrentDate) AS DayTotal,
p.ProductID, p.Name,
ROUND(SUM(oh.TotalDue), 2) AS ProductSubtotal
FROM AdventureWorks.Sales.SalesOrderHeader oh
JOIN AdventureWorks.Sales.SalesOrderDetail od
ON od.SalesOrderID = oh.SalesOrderID
JOIN AdventureWorks.Production.Product p
ON p.ProductID = od.ProductID
WHERE oh.OrderDate = @v_CurrentDate
GROUP BY oh.OrderDate, p.ProductID, p.Name
ORDER BY 5 DESC, p.ProductID ASC
FOR XML AUTO, ELEMENTS, TYPE, ROOT('Order')
END
ELSE
SELECT CAST('No sales records available for this date. ' AS XML)
共需 4 個連線:
| 連線名稱 | 類型 | 用途 |
|---|---|---|
| AdventureWorks | ADO.NET | 資料庫查詢連線 |
| QueryOrder.sql | FILE | 讀取 SQL 腳本 |
| Orders.xsl | FILE | 讀取 XSLT 樣式表 |
| Orders.htm | FILE | 寫入產生的 HTML |

QueryOrder.sql,結果集儲存至 Object 變數Orders.xsl 轉換,寫入 Orders.htmOrders.htm 內容作為郵件本文 (IsBodyHtml=True)<xsl:stylesheet version="1.0" xmlns:xsl="https://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Order">
<html><body>
<h2>Daily Sales Report - <xsl:value-of select="OrderDate"/></h2>
<table border="1" cellpadding="3" cellspacing="0" style="border-collapse:collapse;">
<tr style="background:#4472C4;color:white;">
<th>Product</th><th>Subtotal</th>
</tr>
<xsl:for-each select="SalesOrderHeader">
<tr>
<td><xsl:value-of select="Product/Name"/></td>
<td align="right"><xsl:value-of select="format-number(ProductSubtotal, '#,##0.00')"/></td>
</tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
</xsl:stylesheet>
DATEADD(day, -1, GETDATE()) 自動取前一日