replace value of (XML DML)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Aktualisiert den Wert eines Knotens im Dokument.

Syntax

replace value of Expression1   
with Expression2  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

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 das XML typisiert ist, muss der Typ des Knotens ein simple-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. Dabei kann es sich um einen Ausdruck handeln, der einen einfachen Typknoten zurückgibt, weil data() implizit verwendet wird. Wenn der Wert eine Werteliste ist, ersetzt die update -Anweisung den alten Wert durch die Liste. Beim Ändern einer typisierten XML-Instanz muss Expression2 den gleichen Typ wie Expression1 aufweisen oder ein Untertyp davon sein. Ansonsten wird ein Fehler zurückgegeben. Beim Ändern einer nicht typisierten XML-Instanz muss Expression2 ein Ausdruck sein, der atomisiert werden kann. Ansonsten wird ein Fehler zurückgegeben.

Beispiele

Die folgenden Beispiele der XML DML replace value of -Anweisung zeigen, 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 aktualisieren XML DML replace value of -Anweisungen die 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 if-Ausdrucks zum Bestimmen des Ersetzungswerts

Sie können den if -Ausdruck in Expression2 der XML DML replace value of -Anweisung angeben, wie im folgenden Beispiel gezeigt wird. Expression1 gibt an, dass das LaborHours-Attribut aus dem ersten Arbeitsplatz aktualisiert werden soll. Expression2 verwendet einen if -Ausdruck zum Bestimmen des neuen Werts des LaborHours-Attributs.

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, das in einer nicht typisierten XML-Spalte gespeichert ist

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, das in einer typisierten XML-Spalte gespeichert ist

Dieses Beispiel ersetzt Werte in einem Dokument mit Fertigungsanweisungen, das in einer typisierten XML-Spalte gespeichert ist.

In diesem Beispiel erstellen Sie zuerst eine Tabelle (T) mit einer typisierten XML-Spalte in der AdventureWorks-Datenbank. Anschließend kopieren Sie eine XML-Instanz mit Fertigungsanweisungen aus der Instructions-Spalte in der ProductModel-Tabelle in Tabelle T. Die Einfügungen werden dann am XML in Tabelle T vorgenommen.

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="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  

Beachten Sie die Verwendung von cast beim Ersetzen des LotSize-Werts. Dies ist erforderlich, wenn der Wert einem bestimmten Typ angehören muss. In diesem Beispiel ist eine explizite Umwandlung nicht erforderlich, wenn der Wert 500 lautet.

Weitere Informationen

Vergleichen von typisiertem XML mit nicht typisiertem XML
Erstellen von Instanzen der XML-Daten
xml Data Type Methods (xml-Datentypmethoden)
XML DML (Data Modification Language)