delete (XML DML)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Удаляет узлы из экземпляра XML.
Синтаксис
delete 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
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
Обратите внимание на следующие данные из предыдущего запроса:
Чтобы указать ключевое слово delete языка XML DML, используется метод modify() (тип данных xml).
Для запроса документа используется метод query() (тип данных xml).
C. Удаление узлов из типизированного XML-столбца
В следующем примере удаляются узлы XML-документа с инструкциями по производству продукции, хранящегося в типизированном столбце xml.
В примере сначала создается таблица (T) с типизированным столбцом xml в базе данных AdventureWorks. Затем экземпляр XML с инструкциями по производству продукции копируется из столбца Instructions таблицы ProductModel в таблицу T, после чего из документа удаляются один или несколько узлов.
USE AdventureWorks2022;
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
SET 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)