FOR XML RAW 將每列輸出為單一 <row> 元素,欄位預設為**屬性**,適合簡單扁平化 XML 匯出、Web Service 回傳、異構系統整合。本文系統涵蓋 RAW 模式所有實用選項與實戰範例。
WITH TestXml AS (
SELECT 1 AS id, N'LeeWhoeeUniversity' AS name
UNION ALL SELECT 2, N'SQL Server XML 查詢'
UNION ALL SELECT 3, N'FOR XML'
)
SELECT id, name FROM TestXml FOR XML RAW, TYPE;
TYPE 指示回傳 xml 型別而非 nvarchar(max),支援後續 .query()、.value() 方法。
SELECT id, name FROM TestXml FOR XML RAW, ELEMENTS;
1
LeeWhoeeUniversity
2
SQL Server XML 查詢
3
name 為 NULL,**預設略過該元素**。
SELECT id, name FROM TestXml FOR XML RAW, ELEMENTS XSINIL;
1
LeeWhoeeUniversity
2
SQL Server XML 查詢
3
xmlns:xsi 命名空間宣告。xsi:nil="true",元素存在但無內容。
SELECT id, name FROM TestXml FOR XML RAW, XMLDATA;
<Schema> 區塊描述結構 (屬性型別、長度),後接資料列。XMLSCHEMA。
SELECT id, name FROM TestXml FOR XML RAW, XMLSCHEMA;
xsd:schema (目標命名空間 urn:schemas-microsoft-com:sql:SqlRowSetN),含型別、長度、排序規則、nullable 等完整定義。XMLSCHEMA ('urn:my-namespace')。
SELECT id, CAST(name AS VARBINARY(MAX)) AS binName FROM TestXml FOR XML RAW, BINARY BASE64;
varbinary/image 欄位自動 Base64 編碼為文字,XML 安全傳輸。ELEMENTS 時,二進位值輸出為元素文字內容。
SELECT id, name FROM TestXml FOR XML RAW('MyRow');
SELECT id, name FROM TestXml FOR XML RAW, ROOT('MyRoot');
DECLARE @XmlTable TABLE (xid INT, xname NVARCHAR(50), xmlcol XML);
INSERT @XmlTable VALUES
(1, N'第一行', N'|
|
'),
(2, N'第二行', N'|
');
SELECT xid, xname, xmlcol.query('/myroot') FROM @XmlTable FOR XML RAW;
.query() 回傳 xml 型別片段,外層 FOR XML RAW 再包裝成屬性化 XML。| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 扁平化資料、屬性化、效能優先 | RAW | 輸出緊湊、解析快、記憶體佔用低 |
| 需自訂巢狀結構、元素名稱、混合屬性/元素 | PATH | 彈性最高、支援字串聚合技巧 |
| 主從關係自動巢狀 | AUTO | 依 JOIN 關係自動產生階層 |
| 完全手工控制 (極少用) | EXPLICIT | 複雜度極高、不建議新專案 |
FOR XML 在記憶體中組裝完整 XML,超大結果集會導致 OOM;建議分頁查詢或用 bcp 匯出。PRIMARY XML INDEX + SECONDARY XML INDEX (PATH/VALUE/PROPERTY),加速 .query()/.value()/.exist()。