replace value of (XML DML)
Aktualizuje wartość węzła w dokumencie.
replace value of
Expression1
with
Expression2
Argumenty
Expression1
Określa węzeł, którego wartość ma być aktualizowane.Musi on określić tylko jeden węzeł.Oznacza to, Expression1 musi być pojedyncza statical. Jeśli zostanie wpisany kod XML, typu węzła musi być typu prostego.Jeśli zaznaczonych jest wiele węzłów, uruchamiany jest błąd.If Expression1 returns an empty sequence, no value replacement occurs and no errors are returned.Expression1 must return a single element that has simply typed content (list or atomic types), a text node, or an attribute node.Expression1 cannot be a union type, a complex type, a processing instruction, a document node, or a comment node.Jeśli tak jest, zwracany jest błąd.Expression2
Określa nową wartość w węźle.Może to być wyrażenie, które zwraca po prostu wpisywanych węzła, ponieważ Data() będzie używana domyślnie.Jeśli wartość jest lista wartości, Aktualizacja instrukcja zastępuje starą wartość na liście.W wpisywanych wystąpienie XML, modyfikowanie Expression2 musi być tego samego typu lub podtypem Expression1. W przeciwnym razie zwracany jest błąd.W modyfikowania wystąpienie bez typu XML Expression2 musi być wyrażeniem, które mogą być atomized. W przeciwnym razie zwracany jest błąd.
Przykłady
Następujące przykłady zastępowanie wartości Instrukcja XML DML ilustruje sposób zaktualizować węzły dokumentu XML.
A.Zastępowanie wartości XML wystąpienie
W poniższym przykładzie instancji dokumentu jest najpierw przypisany do zmiennej XML typu.Następnie, zastępowanie wartości Instrukcje 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 aktualizowany obiekt miejsce docelowe musi być, co najwyżej jeden węzeł, który jest jawnie określony w wyrażeniu ścieżka przez dodanie „ [1] na końcu wyrażenie.
B.Za pomocą to wyrażenie w celu określenia wartości zastępcze
Można określić Jeśli wyrażenie wyrażenie2 Zastąp wartość XML DML instrukcja, jak pokazano w poniższym przykładzie.Wyrażenie1 identyfikuje atrybut LaborHours pierwszego gniazda produkcyjnego ma zostać zaktualizowany.Używa wyrażenie2 Jeśli wyrażenie, aby określić nową wartość atrybut LaborHours.
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.Aktualizacja XML przechowywane w kolumna bez typu XML
W poniższym przykładzie aktualizuje przechowywane kolumna XML:
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.Aktualizacja XML przechowywane kolumna XML maszynowy
W tym przykładzie zastępuje wartości w instrukcjach wytwarzania dokument przechowywany kolumna XML pisma.
W przykładzie najpierw utworzyć tabela (T) z wpisaną XML kolumna bazy danych AdventureWorks.Następnie skopiuj wytwarzania instrukcje XML wystąpienie z instrukcji kolumna w tabela ProductModel do tabela T.Wstawienia są następnie stosowane do formatu XML w tabela 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
--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
Należy zwrócić uwagę na użycie Obsada podczas zastępowania LotSize wartości.Jest to wymagane, jeśli wartość musi być określonego typu.W tym przykładzie Jeśli 500 zostały wartości, rzutowania jawne nie będzie konieczne.