Freigeben über


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

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 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 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 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.