replace value of (XML DML)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Aktualisiert den Wert eines Knotens im Dokument.
Syntax
replace value of Expression1
with Expression2
Argumente
Expression1
Gibt einen Knoten an, dessen Wert aktualisiert werden soll. Der Ausdruck darf nur einen einzelnen Knoten angeben. Das heißt, Expression1 muss ein statisches Singleton sein. Wenn der XML-Code eingegeben wird, muss der Typ des Knotens ein einfacher Typ sein. Wenn mehrere Knoten ausgewählt werden, wird ein Fehler ausgelöst. Wenn Expression1 eine leere Sequenz zurückgibt, tritt keine Wertersetzung auf, und es werden keine Fehler zurückgegeben. Expression1 muss ein einzelnes Element zurückgeben, das einfachen Typinhalt hat (wie bei den Typen „list“ und „atomic“) oder ein Textknoten bzw. ein Attributknoten ist. Expression1 kann nicht den Typ „union“ bzw. einem komplexen Typ haben oder eine Verarbeitungsanweisung, ein Dokumentknoten oder ein Kommentarknoten sein. Andernfalls wird ein Fehler zurückgegeben.
Expression2
Gibt den neuen Wert des Knotens an. Es kann sich um einen Ausdruck handeln, der einen einfachen Typknoten zurückgibt, da data()
er implizit verwendet wird. Wenn der Wert eine Liste von Werten ist, ersetzt die update
Anweisung den alten Wert durch die Liste. Wenn Sie eine typierte XML-Instanz ändern, muss Expression2 derselbe Typ oder ein Untertyp von Expression1 sein. Ansonsten wird ein Fehler zurückgegeben. Wenn Sie eine nicht typisierte XML-Instanz ändern, muss Expression2 ein Ausdruck sein, der atomisiert werden kann. Ansonsten wird ein Fehler zurückgegeben.
Beispiele
Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.
Die folgenden Beispiele der replace value of
XML-DML-Anweisung veranschaulichen, wie Knoten in einem XML-Dokument aktualisiert werden.
A. Ersetzen von Werten in einer XML-Instanz
Im folgenden Beispiel wird eine Dokumentinstanz zuerst einer Variablen des Typs xml zugewiesen. Anschließend replace value of
aktualisieren XML-DML-Anweisungen Werte im Dokument.
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;
Das zu aktualisierende Ziel darf höchstens ein Knoten sein, der explizit im „path“-Ausdruck durch Hinzufügen von „[1]“ am Ende des Ausdrucks angegeben wird.
B. Verwenden Des Ausdrucks, um den Ersetzungswert zu ermitteln
Sie können den if
Ausdruck in Expression2 der replace value of
Anweisung angeben, wie im folgenden Beispiel gezeigt. Expression1 identifiziert das LaborHours
Attribut aus dem ersten Arbeitscenter, das aktualisiert werden soll. Expression2 verwendet einen if
Ausdruck, um den neuen Wert des LaborHours
Attributs zu bestimmen.
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. Aktualisieren von XML-Daten, die in einer nicht typisierten XML-Spalte gespeichert sind
Das folgende Beispiel aktualisiert in einer Spalte gespeichertes 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: Aktualisieren von XML-Daten, die in einer typierten XML-Spalte gespeichert sind
Dieses Beispiel ersetzt Werte in einem Dokument mit Fertigungsanweisungen, das in einer typisierten XML-Spalte gespeichert ist.
Im Beispiel erstellen Sie zunächst eine Tabelle (T
) mit einer typierten XML-Spalte in der AdventureWorks2022
Datenbank. Anschließend kopieren Sie eine XML-Instanz der Herstellungsanweisungen aus der Instructions
Spalte in der ProductModel
Tabelle in die Tabelle T
. Einfügungen werden dann auf XML in Tabelle T
angewendet.
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
--insert a new location - <Location 1000/>.
UPDATE T
SET Instructions.modify('
declare namespace MI="http://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="http://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="http://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;
In diesem Beispiel wird beim Ersetzen des Werts LotSize
verwendetcast
. cast
ist erforderlich, wenn der Wert einen bestimmten Typ aufweisen muss. Wenn es sich in diesem Beispiel 500
um den Wert handelt, ist keine explizite Umwandlung erforderlich.