SQL Server 2005 引入原生 xml 資料型別,支援 XQuery/XPath 查詢與 XML DML 修改。本文系統整理從建立欄位、插入資料、多維度查詢(節點值、屬性、跨表關聯)到資料修改的完整實作範例,並附上執行結果說明。
CREATE TABLE xmlTest (
id INT IDENTITY(1,1) PRIMARY KEY,
_x XML -- XML 型別欄位
)
-- 第一筆
INSERT INTO xmlTest (_x) VALUES ('
- item11
- item12
')
-- 第二筆
INSERT INTO xmlTest (_x) VALUES ('
- item21
- item22
')
SELECT _x FROM xmlTest
SELECT _x.query('root/item[1]') FROM xmlTest
SELECT _x.value('(root/item)[1]', 'varchar(50)') FROM xmlTest
SELECT _x.value('(root/item/@attr2)[2]', 'varchar(50)') FROM xmlTest
SELECT t2.c1.value('.', 'varchar(20)') AS items
FROM xmlTest
CROSS APPLY _x.nodes('root/item') AS t2(c1)
SELECT t2.c1.value('@attr2', 'varchar(20)') AS attr2
FROM xmlTest
CROSS APPLY _x.nodes('root/item') AS t2(c1)
WHERE id = 1
SELECT _x.value('(root/item[@attr1="a1"]/@attr2)[1]', 'varchar(50)')
FROM xmlTest WHERE id = 1
情境:表 t2 有欄位 xmlid 關聯 xmlTest.id,及 attr1 需比對 XML 內 @attr1 值
SELECT xmlTest._x.value('(root/item[@attr1=sql:column("t2.attr1")]/@attr2)[1]', 'varchar(50)') AS attr2,
t2.attr1
FROM xmlTest JOIN t2 ON t2.xmlid = xmlTest.id
WHERE xmlTest.id = 1
UPDATE xmlTest
SET _x.modify('replace value of (root/item/text())[1] with "xxxxx"')
WHERE id = 1
-- 驗證
SELECT _x.query('root/item[1]') AS item1 FROM xmlTest
UPDATE xmlTest
SET _x.modify('replace value of (root/item/@attr2)[2] with "2222b"')
WHERE id = 2
-- 驗證
SELECT _x.query('root/item[2]') AS item1 FROM xmlTest
| 方法 | 用途 | 回傳型別 |
|---|---|---|
.query() | 回傳 XML 片段 | xml |
.value() | 回傳純量值(需指定型別) | 指定型別 |
.nodes() | 將 XML 節點拆解為資料列集 | rowset |
.modify() | XML DML:insert/delete/replace | 無(就地修改) |
sql:column() | 在 XQuery 中引用關聯資料行 | 依資料行而定 |
// 後代軸查詢,優先使用具體路徑.modify() 會觸發 XML 索引維護,批次更新時建議先停用索引