delete (XML DML)
Удаляет узлы из экземпляра XML.
Синтаксис
delete Expression
Аргументы
- Expression
Выражение XQuery, определяющее удаляемые узлы. Будут удалены все узлы, указанные в выражении, а также все узлы или значения, содержащиеся в указанных узлах. Как сказано в разделе insert (XML DML), выражение должно ссылаться на существующий узел документа. Оно не может ссылаться на создаваемый узел. Кроме того, выражение не может ссылаться на корневой (/) узел. Если выражение возвращает пустую последовательность, узлы не удаляются и ошибка не создается.
Примеры
А. Удаление узлов документа, хранящегося в нетипизированной 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
Б. Удаление узлов документа, хранящегося в нетипизированном 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
Обратите внимание на следующие нюансы предыдущего запроса.
Чтобы указать ключевое слово delete языка XML DML, используется метод modify() (тип данных xml).
Для запроса документа используется метод query() (тип данных xml).
В. Удаление узлов из типизированного XML-столбца
В следующем примере удаляются узлы XML-документа с инструкциями по производству продукции, хранящегося в типизированном столбце xml.
Этот код сначала создает в базе данных AdventureWorks таблицу (T) с типизированным столбцом xml. Затем экземпляр XML с инструкциями по производству продукции копируется из столбца Instructions таблицы ProductModel в таблицу 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