Usuwanie (XML DML)
Usuwa węzły z wystąpienia XML.
delete Expression
Argumenty
- Expression
Jest wyrażeniem XQuery identyfikującym węzły do usunięcia.Wszystkie węzły wybrane przez wyrażenie, a także wszystkie węzły i wartości zawarte w wybranych węzłach, zostaną usunięte.Zgodnie z opisem opcji insert (XML DML) musi to być odwołanie do istniejącego węzła w dokumencie.Nie może to być skonstruowany węzeł.Wyrażeniem nie może być węzeł główny (/).Jeśli wyrażenie zwraca pustą sekwencję, nic nie zostanie usunięte i nie zostaną zwrócone żadne błędy.
Przykłady
A.Usuwanie węzłów z dokumentu przechowywanego w zmiennej XML bez typu.
W poniższym przykładzie pokazano, jak usuwać różne węzły z dokumentu.Najpierw wystąpienie XML zostaje przypisana do zmiennej typu xml.Następnie kolejne instrukcje delete XML DML usuwają różne węzły z dokumentu.
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.Utworzone za pomocą opcji replikacja dla procedura przechowywana jest używany jako filtr procedura przechowywana i jest wykonywana tylko podczas replikacja.
W poniższym przykładzie Usuwanie Instrukcja XML DML usuwa drugi element podrzędność <Features> z dokumentu, przechowywane kolumna.
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
Pierwszy przycisk jest przyciskiem domyślnym.
The modify() metoda (xml Data Type) is used to specify the delete XML DML keyword.
The query() metoda (xml Data Type) is used to query the document.
C.Usuwanie węzłów z kolumny typu XML
W tym przykładzie usuwa węzły z instrukcjami produkcji, dokumentu XML przechowywane w maszynowy XML kolumna.
W przykładzie najpierw utworzyć tabela (T) z maszynowy XML kolumna bazy danych AdventureWorks.Aby uzyskać informacje dotyczące pewne ograniczenia, które mają zastosowanie zobacz sekcję Spostrzeżenia.
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