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

SQL Server XML 支援與查詢輸出 XML 完整指南:FOR XML 子句與 HTTP 端點實作

     編輯:Oracle 資料庫基礎

SQL Server 內建強大的 XML 支援,可將查詢結果直接序列化為 XML,並透過 HTTP 端點對外發布。本文系統整理 `FOR XML` 四大模式、XML Schema/Data 選項、`ELEMENTS`/`BINARY BASE64` 指令,以及 IIS 整合發布 XML 的完整配置步驟與 URL 呼叫範例。

一、FOR XML 子句四大模式

SELECT ... FROM table
FOR XML { RAW | AUTO | EXPLICIT | PATH }
[ , XMLDATA ] [ , ELEMENTS ] [ , BINARY BASE64 ]

輸出為**無根節點的 XML 片段**,需搭配 `ROOT('根節點名')` 產生完整 XML 文件。

1. FOR XML RAW

每列輸出為 ``,屬性導向,適合簡單扁平化輸出。

2. FOR XML AUTO

根據查詢表關係自動產生巢狀結構:`<表名 欄位="值" ...><子表名 ... />`,啟發式推導階層,適合快速原型。

3. FOR XML EXPLICIT

**完全手工控制**輸出結構,需在 SELECT 中使用特定欄位名 (`Tag`、`Parent`、`SortOrder` 等) 定義階層,彈性最高但複雜度高,舊版本常用。

4. FOR XML PATH (2005+ 推薦)

使用 XPath 風格欄位別名定義結構:`SELECT col1 AS '@attr', col2 AS 'child/element' ... FOR XML PATH('node'), ROOT('root')`,直觀易維護,取代 EXPLICIT。

二、常用選項說明

選項效果
XMLDATA輸出前置 XDR Schema (舊標準),``
ELEMENTS強制欄位以**子元素**而非屬性輸出:`值`
BINARY BASE64二進制資料 (image/varbinary) 以 Base64 編碼輸出
ROOT('名稱')包裹根節點,產出完整 XML 文件

三、HTTP 端點發布 XML (SQLXML + IIS)

前置需求

  • IIS 5.1+ / SQL Server 2000+
  • 安裝 SQLXML (含 '在 IIS 中配置 SQL XML 支援' 工具)

虛擬目錄配置步驟

  1. 開啟配置工具,建立虛擬目錄 (如 `Test`)
  2. 常規: 虛擬名稱、物理路徑
  3. 安全性: 身分驗證 (Windows/基本/匿名)、SQL 登入帳號
  4. 資料源: 選擇目標資料庫
  5. 設定: 勾選「允許模板」、依需求啟用「允許 URL 查詢 (sql=...)」、「允許 XPath」、「允許 POST」
  6. 虛擬名稱: 定義 `https://localhost/Test/db/table/...` 映射

三種呼叫方式

1. URL 直接附加 SQL (需啟用 URL 查詢)

https://localhost/Test?sql=SELECT+*+FROM+table+FOR+XML+AUTO&root=root

2. URL 附加 XML 模板 (長度受限)

https://localhost/Test?template=SELECT+*+FROM+table+FOR+XML+AUTO

3. 模板檔案 (生產環境推薦)

建立 `template.xml` 放置虛擬目錄下:



  
    SELECT * FROM table FOR XML AUTO
  

呼叫:`https://localhost/Test/template.xml`

XPath 過濾 (模板檔案模式)

https://localhost/Test/template.xml/col[@attr="value"]

模板檔案 URL 後直接接 XPath 表達式過濾結果。

四、安全與效能建議

  • 生產環境禁用 URL 直接 SQL (sql=), 僅允許預先審核的模板檔案
  • 使用 **預存程序 + FOR XML** 封裝邏輯,模板呼叫 `EXEC sp_GetData`
  • 啟用 **IIS 請求篩選** 限制 URL 長度、封鎖可疑字元
  • 大量資料分頁輸出:`OFFSET ... ROWS FETCH NEXT ... ROWS ONLY` (2012+) 配合 XML 序列化
  • 考慮 **原生 XML Web Service (SOAP/REST)** 替代傳統 SQLXML/IIS 架構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved