SQL Server XML 模板 (HTTP 端點) 高度流程化、效能極佳,但功能受限。當需求超出模板能力時,架構演進路徑:
XML Template (ISAPI)
↓ 需求:多伺服器存取、未知 HTTP 格式、COM/COM+、分散式交易、外部 Web Service
Custom ISAPI / ASP + COM+ / ASP.NET Web API / WCF
| 層級 | 職責 | 技術選項 | XML 角色 |
|---|---|---|---|
| 表示層 | UI 渲染、HTTP 協定處理 | ASP/ASP.NET、XSLT 轉換、AJAX | XML 為資料傳輸格式,XSLT 生成 HTML/JSON |
| 工作流層 | 業務流程編排、長時間交易、狀態機 | COM+、BizTalk、WF、Service Broker | XML 訊息在流程間傳遞 |
| 業務邏輯層 | 核心規則、驗證、計算、決策 | COM+ 元件、.NET 組件、CLR 存儲過程 | XML 為參數/回傳值,或文件型輸入 |
| 資料存取層 | CRUD、查詢、大量作業、交易控制 | ADO 2.6 Stream、SqlClient、XML 批次 | XML 為原生型別,FOR XML/OPENXML/nodes() |
傳統 n-tier 假設資料庫擴展性最差,盡量輕量。但 SQL Server 2000/2005 引入:
若採用「重資料庫」叢集 (高規格 DB 伺服器),可將業務邏輯分層封裝在資料庫內:
-- 資料存取層:基礎 CRUD、批次作業
CREATE PROC DAL_InsertOrder @OrderXml XML AS ...
-- 業務邏輯層:規則、計算、驗證
CREATE PROC BLL_ProcessOrder @OrderXml XML AS
BEGIN
-- 呼叫 DAL、執行規則、回傳結果 XML
EXEC DAL_ValidateOrder @OrderXml;
EXEC DAL_CalcPricing @OrderXml OUTPUT;
EXEC DAL_InsertOrder @OrderXml;
END
-- 工作流層:流程編排、狀態流轉
CREATE PROC WF_SubmitOrder @OrderXml XML AS
BEGIN
EXEC BLL_ProcessOrder @OrderXml;
EXEC DAL_LogWorkflow @OrderXml, 'Submitted';
-- 非同步觸發:Service Broker 發送訊息
SEND ON CONVERSATION @Handle MESSAGE TYPE OrderSubmitted (@OrderXml);
END
-- 表示層介面:單一進入點
CREATE PROC API_SubmitOrder @OrderXml XML AS
BEGIN
EXEC WF_SubmitOrder @OrderXml;
SELECT @OrderXml; -- 回傳結果 XML
END
-- 反模式:單一大存儲過程含切換邏輯
CREATE PROC SmartProc @Action NVARCHAR(50), @Params NTEXT AS
BEGIN
EXEC CommonOps;
IF @Action = 'Action1' EXEC BLL_Action1 @Params;
ELSE IF @Action = 'Action2' EXEC BLL_Action2 @Params;
-- 優化器僅為首次執行路徑編譯最佳計劃,其他路徑效能差
END
-- 優化:拆分為獨立存儲過程,共用邏輯抽取為輔助過程
CREATE PROC Proc_Action1 @Params NTEXT AS
BEGIN
EXEC CommonOps;
EXEC BLL_Action1 @Params;
END
CREATE PROC Proc_Action2 @Params NTEXT AS
BEGIN
EXEC CommonOps;
EXEC BLL_Action2 @Params;
END
-- 每個過程獨立編譯最佳計劃,避免參數嗅探/計劃污染
Web 開發最大優勢:使用者看不見實作細節。可將多種架構混合部署:
本系列結束。核心啟示:SQL Server XML 能力已超越單純資料交換,配合原生 XML 型別、XQuery、CLR、Service Broker,可構建高效能、強型別、可擴展的以資料為中心應用架構。