Zamień wartość (XML DML)
Aktualizuje wartość węzła w dokumencie.
Składnia
replace value of
Expression1
with
Expression2
Argumenty
Expression1
Identyfikuje węzeł, której wartość ma być aktualizowane.Należy określić staje się tylko jeden węzeł.Oznacza to, że Expression1 musi być pojedyncza statical.Jesli XML typu węzeł musi być typu prostego.Jeśli zaznaczonych jest wiele węzłów, powstaje błąd.Jeśli Expression1 zwraca pusty, nie zastępowania wartości sekwencja i błędy nie są zwracane.Expression1musi zwracać pojedynczy element, który ma po prostu wpisany zawartości (typy listy lub niepodzielny ), węzeł tekstowy lub węzeł atrybut .Expression1nie może być typu, typu złożonego, instrukcję przetwarzania, węzeł dokumentu lub węzeł komentarz.Jeśli tak jest, zwracany jest błąd.Expression2
Określa nową wartość węzła.Może to być wyrażenie , które zwraca węzła po prostu maszynowy, ponieważ data() będą używane domyślnie.Jeśli wartość jest lista wartości, Aktualizacja instrukcja zastępuje starą wartość z listy.Modyfikowanie maszynowy XML wystąpienie Expression2 musi być tego samego typu i podtypu z Expression1.W przeciwnym razie zwracany jest błąd.Modyfikowanie bez typu XML wystąpienie, Expression2 musi być wyrażenie , które można atomized.W przeciwnym razie zwracany jest błąd.
Przykłady
Następujące przykłady zastąpić wartość XML DML instrukcja ilustruje sposób zaktualizować węzłów dokumentu XML.
A.Zamiana wartości w XML wystąpienie
W poniższym przykładzie dokument wystąpienie przypisania w pierwszej kolejności do zmiennej xml typu.Następnie zastąpić wartość instrukcji XML DML aktualizacji wartości w dokumencie.
DECLARE @myDoc xml
SET @myDoc = '<Root>
<Location LocationID="10"
LaborHours="1.1"
MachineHours=".2" >Manufacturing steps are described here.
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>'
SELECT @myDoc
-- update text in the first manufacturing step
SET @myDoc.modify('
replace value of (/Root/Location/step[1]/text())[1]
with "new text describing the manu step"
')
SELECT @myDoc
-- update attribute value
SET @myDoc.modify('
replace value of (/Root/Location/@LaborHours)[1]
with "100.0"
')
SELECT @myDoc
Należy zauważyć, że miejsce docelowe aktualizowany muszą, co najwyżej jeden węzeł, który jest jawnie określony w ścieżka wyrażenie przez dodanie "[1]" na końcu wyrażenie.
B.Za pomocą Jeżeli wyrażenie do określenia wartości zastępczych
Można określić Jeśli wyrażenie w wyrażenie2 o zastąpić wartość XML DML instrukcja, jak pokazano w poniższym przykładzie.Wyrażenie1 identyfikuje LaborHours atrybut z pierwszego gniazda produkcyjnego ma być aktualizowane.Używa wyrażenie2 Jeśli wyrażenie , aby określić nową wartość atrybutLaborHours.
DECLARE @myDoc xml
SET @myDoc = '<Root>
<Location LocationID="10"
LaborHours=".1"
MachineHours=".2" >Manu steps are described here.
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>'
--SELECT @myDoc
SET @myDoc.modify('
replace value of (/Root/Location[1]/@LaborHours)[1]
with (
if (count(/Root/Location[1]/step) > 3) then
"3.0"
else
"1.0"
)
')
SELECT @myDoc
C.Aktualizowanie XML przechowywanych w bez typu XML kolumna
Poniższy przykład aktualizuje przechowywane w kolumnaXML:
drop table T;
go
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 current <ProductDescription> element
SELECT x.query(' /Root/ProductDescription')
FROM T;
-- update the ProductName attribute value
UPDATE T
SET x.modify('
replace value of (/Root/ProductDescription/@ProductName)[1]
with "New Road Bike" ');
-- verify the update
SELECT x.query(' /Root/ProductDescription')
FROM T;
D.Aktualizowanie XML przechowywanych w maszynowy XML kolumna
W tym przykładzie zastępuje wartości w instrukcjach wytwarzania dokument przechowywany w maszynowy XML kolumna.
W przykładzie najpierw tworzenia tabela (T) z wpisaną XML kolumna w AdventureWorks2008R2 bazy danych.Następnie skopiuj wytwarzania instrukcje XML wystąpienie z instrukcjami kolumna ProductModel tabela do tabela T.Wstawienia są stosowane do pliku XML w tabela T.
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
--insert a new location - <Location 1000/>.
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" LotSize="1000" >
<MI:step>Do something using <MI:tool>hammer</MI:tool></MI:step>
</MI:Location>
as first
into (/MI:root)[1]
');
go
select Instructions
from T;
go
-- Now replace manu. tool in location 1000
update T
set Instructions.modify('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
replace value of (/MI:root/MI:Location/MI:step/MI:tool)[1]
with "screwdriver"
');
go
select Instructions
from T;
-- Now replace value of lot size
update T
set Instructions.modify('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
replace value of (/MI:root/MI:Location/@LotSize)[1]
with 500 cast as xs:decimal ?
');
go
select Instructions
from T;
Zwróć uwagę na zastosowanie oddanych podczas zastępowania wartości LotSize.Jest to wymagane, gdy wartość musi być określonego typu.W tym przykładzie wartość, gdyby 500 jawne Rzutowanie nie powinno być konieczne.