Delen via


vervang de waarde van (XML DML)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Ze werkt de waarde van een knoop in het document bij.

Syntaxis

replace value of Expression1
with Expression2

Arguments

Expressie1

Identificeert een knoop waarvan de waarde bijgewerkt moet worden. Het mag slechts één knoop identificeren. Dat wil zeggen, Expression1 moet een statische singleton zijn. Als de XML getypeerd is, moet het type van de knoop een eenvoudig type zijn. Wanneer meerdere knooppunten worden geselecteerd, wordt een foutmelding geactiveerd. Als Expression1 een lege reeks teruggeeft, vindt geen waardevervanging plaats en worden er geen fouten teruggegeven. Expression1 moet een enkel element teruggeven dat eenvoudige type-inhoud heeft (lijst- of atomaire types), een tekstknoop of een attribuutknoop. Expression1 kan geen unietype, complex type, verwerkingsinstructie, documentknoop of commentaarsknooppunt zijn, anders wordt er een foutmelding teruggegeven.

Expressie2

Identificeert de nieuwe waarde van de node. Het kan een uitdrukking zijn die een eenvoudige typeknoop teruggeeft, omdat data() wordt impliciet gebruikt. Als de waarde een lijst van waarden is, vervangt de update instructie de oude waarde door de lijst. Wanneer je een getypeerde XML-instantie aanpast, moet Expression2 hetzelfde type zijn of een subtype van Expression1. Anders wordt een foutmelding teruggegeven. Wanneer je een ongetypeerde XML-instantie aanpast, moet Expression2 een expressie zijn die geatomiseerd kan worden. Anders wordt een foutmelding teruggegeven.

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

De volgende voorbeelden van de replace value of XML DML-instructie illustreren hoe knooppunten in een XML-document worden bijgewerkt.

Eén. Vervang waarden in een XML-instantie

In het volgende voorbeeld wordt een documentinstantie eerst toegewezen aan een variabele van xml-type . Vervolgens updaten replace value of XML DML-instructies de waarden in het document.

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;

Het te updaten doel moet hooguit één knoop zijn die expliciet in de padexpressie is gespecificeerd door aan het einde van de expressie een "[1]" toe te voegen.

B. Gebruik de if-uitdrukking om de vervangingswaarde te bepalen

Je kunt de if expressie in Expression2 van de replace value of uitspraak specificeren, zoals getoond in het volgende voorbeeld. Expression1 identificeert het LaborHours attribuut van het eerste werkcentrum dat moet worden bijgewerkt. Expressie2 gebruikt een if expressie om de nieuwe waarde van het LaborHours attribuut te bepalen.

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. Werk XML bij die is opgeslagen in een niet-getypte XML-kolom

Het volgende voorbeeld werkt XML bij die in een kolom is opgeslagen:

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. Update XML die is opgeslagen in een getypeerde XML-kolom

Dit voorbeeld vervangt waarden in een productie-instructies document dat is opgeslagen in een getypte XML-kolom.

In het voorbeeld maak je eerst een tabel (T) aan met een getypeerde XML-kolom in de AdventureWorks2025 database. Vervolgens kopieer je een XML-instantie van een manufacturing instructions van de Instructions kolom in de ProductModel tabel naar de tabel T. Inserties worden vervolgens toegepast op XML in tabel T.

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;

Dit voorbeeld wordt gebruikt cast bij het vervangen LotSize van waarde. cast is vereist wanneer de waarde van een specifiek type moet zijn. In dit voorbeeld, als 500 de waarde is, is expliciete casting niet nodig.