CREATE TABLE xmlTable(
id INT IDENTITY(1,1) NOT NULL,
doc XML NULL
);
INSERT INTO xmlTable(doc)
SELECT * FROM OPENROWSET(BULK 'C:\1.xml', SINGLE_CLOB) x;
1.xml 範例:
dafaf2dafaf3dafaf4
INSERT INTO xmlTable(doc) VALUES('123 ');
-- 取第一個 id>2 的 節點文字
SELECT doc.value('(/dd/a[@id>2])[1]', 'NVARCHAR(50)') FROM xmlTable;
-- 條件查詢:節點值 = '博客園'
SELECT * FROM xmlTable WHERE doc.value('(/dd/a[@id>2])[1]', 'NVARCHAR(50)') = N'博客園';
-- 內部插入 (成爲子節點)
UPDATE xmlTable SET doc.modify('insert 123 into (/dd)[1]');
-- 同級插入:after / before
UPDATE xmlTable SET doc.modify('insert new after (/dd/a)[1]');
UPDATE xmlTable SET doc.modify('insert new before (/dd/a)[1]');
UPDATE xmlTable SET doc.modify('delete (/dd/a)[1]'); -- 刪除第一個
UPDATE xmlTable
SET doc.modify('replace value of (/dd/a/text())[1] with "博客園"');
| 操作 | modify() XQuery 範本 |
|---|---|
| 插入子節點 | insert |
| 插入同級 (後) | insert |
| 插入同級 (前) | insert |
| 刪除節點 | delete (/path/to/node)[1] |
| 替換節點值 | replace value of (/path/text())[1] with "new value" |
| 替換屬性值 | replace value of (/path/@attr)[1] with "new" |
modify() 僅能在 UPDATE ... SET xml_col.modify(...) 中使用,不可單獨 SELECT。[1] 為單一節點限定,必須加上,否則報錯「XQuery 運算式必須為單一節點」。WITH XMLNAMESPACES(...) 或在 XQuery 中宣告。