Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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.