首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 XML 查詢完整指南:FOR XML 子句深度解析

     編輯:關於SqlServer

前言

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 範例資料庫實戰演示,幫助開發者快速掌握這項實用技能。

FOR XML 基本語法

SQL Server 2000 中產生 XML 的核心語法如下:

SELECT <select_list>
FROM <table_source>
WHERE <search_condition>
FOR XML AUTO | RAW | EXPLICIT [, XMLDATA] [, ELEMENTS] [, BINARY BASE64]
  • AUTO:依據查詢的資料表與欄位順序自動產生巢狀 XML,最常用於單表或簡單聯結。
  • RAW:將每一列轉換為通用的 <row> 元素,欄位以屬性呈現,適合平面化資料。
  • EXPLICIT:透過指定 Tag 與 Parent 欄位,完全控制 XML 階層結構,功能最強但撰寫較複雜。

輔助選項:

  • XMLDATA:回傳內嵌 XDR Schema。
  • ELEMENTS:強制以子元素而非屬性輸出欄位值。
  • BINARY BASE64:二進位資料以 Base64 編碼輸出。

實戰演示:Northwind 資料庫

以下範例均在 SQL Server 2000 查詢分析器中執行。

一、AUTO 模式

AUTO 模式是生成單表或主從關聯 XML 最直觀的方式。

1. 簡單單表查詢

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" />

2. 多表聯結查詢(主從巢狀)

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 模式

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 模式

EXPLICIT 模式提供完全控制權,需在 SELECT 清單中指定 Tag(元素標識)與 Parent(父元素標識),並使用 ElementName!Tag!AttributeName 命名慣例定義屬性/子元素。適合產生複雜、非標準階層的 XML 文件。因篇幅限制,此處不再展開範例,開發者可參考官方文件深入學習。

進階技巧與注意事項

  • 效能考量:大量資料轉 XML 時,建議在應用層分頁處理,避免單次回傳過大 XML 導致網路與記憶體壓力。
  • 編碼處理:SQL Server 2000 預設以 UTF-16 輸出,若需 UTF-8,可在應用層轉換或使用 ADO Stream 物件指定編碼。
  • 結合 XMLDATA:啟用 XMLDATA 可取得內嵌 Schema,方便用戶端驗證,但會增加輸出體積。
  • 二進位欄位:包含 image、varbinary 等欄位時,務必加上 BINARY BASE64 選項,否則會報錯。

總結

SQL Server 2000 的 FOR XML 子句為資料庫直接產出 XML 提供了三種互補的模式:AUTO 適合快速產生標準巢狀結構;RAW 適合平面化資料交換;EXPLICIT 則滿足高度客製化需求。善用這項功能可減少中介層轉換代碼,提升開發效率。隨著 SQL Server 版本演進(2005+ 引入 TYPE 指令、XQuery 支援、xml 資料型別),XML 處理能力更趨完善,建議開發者持續跟進新版本特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved