Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
SQL-Datenbank in Microsoft Fabric
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 Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage 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 AdventureWorks2025 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 Tangewendet.
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 cast verwendetLotSize.
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.