刪除 (XML DML)
從 XML 執行個體刪除節點。
語法
delete Expression
引數
- Expression
是一種 XQuery 運算式,可識別要刪除的節點。會刪除運算式所選取的所有節點,以及選取節點內所包含的所有節點或值。如 insert (XML DML) 中所述,必須是文件中現有節點的參考。它不能是建構節點。運算式不可以是根 (/) 節點。如果運算式傳回空白時序,就不會發生刪除,也不會傳回錯誤。
範例
A. 從不具類型的 xml 變數所儲存的文件刪除節點
下列範例說明如何從文件刪除各個節點。首先,將 XML 執行個體指派給 xml 類型的變數。接著,後續的 delete XML DML 陳述式會從文件刪除各個節點。
DECLARE @myDoc xml
SET @myDoc = '<?Instructions for=TheWC.exe ?>
<Root>
<!-- instructions for the 1st work center -->
<Location LocationID="10"
LaborHours="1.1"
MachineHours=".2" >Some text 1
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>'
SELECT @myDoc
-- delete an attribute
SET @myDoc.modify('
delete /Root/Location/@MachineHours
')
SELECT @myDoc
-- delete an element
SET @myDoc.modify('
delete /Root/Location/step[2]
')
SELECT @myDoc
-- delete text node (in <Location>
SET @myDoc.modify('
delete /Root/Location/text()
')
SELECT @myDoc
-- delete all processing instructions
SET @myDoc.modify('
delete //processing-instruction()
')
SELECT @myDoc
B. 從不具類型的 xml 資料行所儲存的文件刪除節點
在下列範例中,delete XML DML 陳述式會從資料行所儲存的文件,移除 <Features
> 的第二個子元素。
CREATE TABLE T (i int, x xml)
go
INSERT INTO T VALUES(1,'<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>')
go
-- verify the contents before delete
SELECT x.query(' //ProductDescription/Features')
FROM T
-- delete the second feature
UPDATE T
SET x.modify('delete /Root/ProductDescription/Features/*[2]')
-- verify the deletion
SELECT x.query(' //ProductDescription/Features')
FROM T
注意下列項目是從上一個查詢而來:
- modify() 方法 (xml 資料類型) 是用以指定 delete XML DML 關鍵字。
- query() 方法 (xml 資料類型) 是用以查詢文件。
C. 從具類型的 xml 資料行刪除節點
此範例會從具 xml 類型的資料行中所儲存的製造指示 XML 文件刪除節點。
在此範例中,您先在 AdventureWorks 資料庫中建立一個資料表 (T),並包含具 xml 類型的資料行。接著便從 ProductModel 資料表的 Instructions 資料行將製造指示 XML 執行個體複製為 T 資料表,並從該文件刪除一或多個節點。
use AdventureWorks
go
drop table T
go
create table T(ProductModelID int primary key,
Instructions xml (Production.ManuInstructionsSchemaCollection))
go
insert T
select ProductModelID, Instructions
from Production.ProductModel
where ProductModelID=7
go
select Instructions
from T
--1) insert <Location 1000/>. Note: <Root> must be singleton in the query
update T
set Instructions.modify('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
insert <MI:Location LocationID="1000" LaborHours="1000" >
These are manu steps at location 1000.
<MI:step>New step1 instructions</MI:step>
Instructions for step 2 are here
<MI:step>New step 2 instructions</MI:step>
</MI:Location>
as first
into (/MI:root)[1]
')
go
select Instructions
from T
-- delete an attribute
update T
set Instructions.modify('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
delete(/MI:root/MI:Location[@LocationID=1000]/@LaborHours)
')
go
select Instructions
from T
-- delete text in <location>
update T
set Instructions.modify('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
delete(/MI:root/MI:Location[@LocationID=1000]/text())
')
go
select Instructions
from T
-- delete 2nd manu step at location 1000
update T
set Instructions.modify('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
delete(/MI:root/MI:Location[@LocationID=1000]/MI:step[2])
')
go
select Instructions
from T
-- cleanup
drop table T
go
請參閱
概念
具類型與不具類型的 XML
XML 資料類型
產生 XML 執行個體
XML 資料修改語言 (XML DML)
XML 應用程式範例