XML 技術憑藉其跨平台、自描述等優勢,已成為現代軟體開發的核心標準。微軟 .NET 平台透過 System.Xml 命名空間提供了強大的 XML 操作支援,ADO.NET 的 DataSet 更將關聯式資料庫與 XML 無縫整合。然而,許多開發人員習慣先用 .NET 取得資料集再轉換為 XML,往往忽略了 Transact-SQL 內建的 FOR XML 子句可直接從資料庫產生結構化 XML,這在特定場景下更為簡潔高效。本文將系統整理 SQL Server 2000 中 FOR XML 的三種模式(AUTO、RAW、EXPLICIT)及其進階選項,並以 Northwind 範例資料庫實戰演示,幫助開發者快速掌握這項實用技能。
SQL Server 2000 中產生 XML 的核心語法如下:
SELECT <select_list>
FROM <table_source>
WHERE <search_condition>
FOR XML AUTO | RAW | EXPLICIT [, XMLDATA] [, ELEMENTS] [, BINARY BASE64]
<row> 元素,欄位以屬性呈現,適合平面化資料。Tag 與 Parent 欄位,完全控制 XML 階層結構,功能最強但撰寫較複雜。輔助選項:
XMLDATA:回傳內嵌 XDR Schema。ELEMENTS:強制以子元素而非屬性輸出欄位值。BINARY BASE64:二進位資料以 Base64 編碼輸出。以下範例均在 SQL Server 2000 查詢分析器中執行。
AUTO 模式是生成單表或主從關聯 XML 最直觀的方式。
SELECT CategoryID, CategoryName
FROM Categories
WHERE CategoryID < 3
FOR XML AUTO
輸出結果:
<Categories CategoryID="1" CategoryName="Beverages" />
<Categories CategoryID="2" CategoryName="Condiments" />
別名會直接成為元素名稱:
SELECT CategoryID AS ID, CategoryName, GetDate() AS CurrDate
FROM Categories MyTable
WHERE CategoryID < 3
FOR XML AUTO
<MyTable ID="1" CategoryName="Beverages" CurrDate="2005-06-24T11:09:52.937" />
<MyTable ID="2" CategoryName="Condiments" CurrDate="2005-06-24T11:09:52.937" />
SELECT Categories.CategoryID, Categories.CategoryName,
Products.ProductID, Products.ProductName
FROM Categories
JOIN Products ON Categories.CategoryID = Products.CategoryID AND ProductID < 5
WHERE Categories.CategoryID < 3
FOR XML AUTO
輸出結果:
<Categories CategoryID="1" CategoryName="Beverages">
<Products ProductID="1" ProductName="Chai" />
</Categories>
<Categories CategoryID="2" CategoryName="Condiments">
<Products ProductID="2" ProductName="Chang" />
</Categories>
AUTO 模式會依據 SELECT 清單中資料表出現的順序,自動建立父子階層:先出現的表為父層,後出現的為子層。
RAW 模式將每一筆記錄轉為統一的 <row> 元素,適合需平面化 XML 的場景(如 Web Service 回傳)。
SELECT CategoryID, CategoryName
FROM Categories
WHERE CategoryID < 3
FOR XML RAW
<row CategoryID="1" CategoryName="Beverages" />
<row CategoryID="2" CategoryName="Condiments" />
搭配 ELEMENTS 選項可改以子元素輸出:
SELECT CategoryID, CategoryName
FROM Categories
WHERE CategoryID < 3
FOR XML RAW, ELEMENTS
<row>
<CategoryID>1</CategoryID>
<CategoryName>Beverages</CategoryName>
</row>
<row>
<CategoryID>2</CategoryID>
<CategoryName>Condiments</CategoryName>
</row>
EXPLICIT 模式提供完全控制權,需在 SELECT 清單中指定 Tag(元素標識)與 Parent(父元素標識),並使用 ElementName!Tag!AttributeName 命名慣例定義屬性/子元素。適合產生複雜、非標準階層的 XML 文件。因篇幅限制,此處不再展開範例,開發者可參考官方文件深入學習。
XMLDATA 可取得內嵌 Schema,方便用戶端驗證,但會增加輸出體積。image、varbinary 等欄位時,務必加上 BINARY BASE64 選項,否則會報錯。SQL Server 2000 的 FOR XML 子句為資料庫直接產出 XML 提供了三種互補的模式:AUTO 適合快速產生標準巢狀結構;RAW 適合平面化資料交換;EXPLICIT 則滿足高度客製化需求。善用這項功能可減少中介層轉換代碼,提升開發效率。隨著 SQL Server 版本演進(2005+ 引入 TYPE 指令、XQuery 支援、xml 資料型別),XML 處理能力更趨完善,建議開發者持續跟進新版本特性。