delete (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> の 2 番目の子要素を削除します。
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 ドキュメントからノードを削除します。
この例では、まず、型指定された xml 列を含むテーブル (T) を AdventureWorks2008R2 データベースに作成します。続いて、ProductModel テーブルの Instructions 列から製造手順の XML インスタンスをテーブル T にコピーし、このコピーされたドキュメントから 1 つ以上のノードを削除します。
use AdventureWorks2008R2;
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