Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL databáze v Microsoft Fabric
Aktualizuje hodnotu uzlu v dokumentu.
Syntaxe
replace value of Expression1
with Expression2
Arguments
Výraz 1
Identifikuje uzel, jehož hodnota má být aktualizována. Musí identifikovat pouze jeden uzel. To znamená, že Expression1 musí být statický singleton. Pokud je XML zadáno, typ uzlu musí být jednoduchý typ. Když je vybráno více uzlů, objeví se chyba. Pokud Expression1 vrátí prázdnou sekvenci, nedochází k nahrazení hodnoty a chyby se nevrátí. Expression1 musí vrátit jeden prvek, který obsahuje jednoduchý typ (seznamové nebo atomické typy), textový uzel nebo atributový uzel. Expression1 nemůže být union type, komplexní typ, instrukce pro zpracování, dokument node ani komentářový uzel, jinak se vrací chyba.
Výraz 2
Identifikuje novou hodnotu uzlu. Může to být výraz, který vrací jednoduchý typ uzlu, protože data() se používá implicitně. Pokud je hodnota seznamem hodnot update , příkaz nahrazuje starou hodnotu seznamem. Když upravujete typovanou XML instanci, Expression2 musí být stejného typu nebo podtypu Expression1. Jinak se vrátí chyba. Když upravujete netypovanou XML instanci, Expression2 musí být výraz, který lze atomizovat. Jinak se vrátí chyba.
Examples
Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .
Následující příklady příkazu replace value of XML DML ilustrují, jak aktualizovat uzly v XML dokumentu.
A. Nahrazení hodnot v XML instanci
V následujícím příkladu je instance dokumentu nejprve přiřazena proměnné typu xml . Poté XML DML příkazy replace value of aktualizují hodnoty v dokumentu.
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;
Aktualizovaným cílem musí být maximálně jeden uzel, který je explicitně specifikován v cestním výrazu přidáním "[1]" na konec výrazu.
B. Použijte výraz if k určení hodnoty náhrady
Můžete specifikovat if výraz ve Expression2replace value of tohoto tvrzení, jak je ukázáno v následujícím příkladu. Expression1 identifikuje LaborHours atribut z prvního pracovního centra, které má být aktualizováno.
Expression2 používá if výraz k určení nové hodnoty LaborHours atributu.
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. Aktualizovat XML uložený v netypovaném sloupci XML
Následující příklad aktualizuje XML uložený ve sloupci:
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. Aktualizovat XML uložený v psaném XML sloupci
Tento příklad nahrazuje hodnoty v dokumentu výrobních instrukcí uložených v napsaném XML sloupci.
V příkladu nejprve vytvoříte tabulku (T) s napsaným XML sloupcem v databázi AdventureWorks2025 . Poté zkopírujete XML instanci výrobních instrukcí ze sloupce Instructions v ProductModel tabulce do tabulky T. Následně jsou vložení aplikována do XML v tabulce 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;
Tento příklad se používá cast při nahrazování LotSize hodnoty.
cast je vyžadováno, když musí být hodnota určitého typu. V tomto příkladu, pokud 500 je hodnota, explicitní sesílání není nutné.