Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
Frissíti a dokumentumban lévő csomópont értékét.
Szemantika
replace value of Expression1
with Expression2
Arguments
Kifejezés1
Azonosít egy csomópontot, amelynek értékét frissíteni kell. Csak egyetlen csomópontot kell azonosítania. Vagyis az 1-es kifejezésnek statikus singletonnak kell lennie. Ha az XML gépezett, akkor a csomópont típusának egyszerű típusnak kell lennie. Ha több csomópontot választunk, hiba keletkezik. Ha az 1-es kifejezés üres sorozatot ad vissza, nem történik értékcsere, és nem jelenik meg hiba. Az 1-es kifejezésnek egyetlen elemet kell visszaadnia, amely egyszerű típustartalommal rendelkezik (lista vagy atomi típusok), egy szövegcsomópontot vagy attribútumcsomópontot. Az 1-es kifejezés nem lehet uniótípus, komplex típus, feldolgozási utasítás, dokumentumcsomópont vagy kommentcsomópont, különben hiba jelenik meg.
Kifejezés2
Azonosítja a csomópont új értékét. Ez lehet egy olyan kifejezés, amely egyszerű típuscsomópontot ad vissza, mert data() implicit módon használják. Ha az érték egy értéklista, az állítás update a régi értéket a listára cseréli. Amikor módosítasz egy gépelt XML példányt, az Expression2-nek ugyanannak a típusnak vagy az Expression1 altípusának kell lennie. Ellenkező esetben hiba jelenik meg. Amikor módosítasz egy típus nélküli XML példányt, az Expression2-nek egy atomizálható kifejezésnek kell lennie. Ellenkező esetben hiba jelenik meg.
Példák
A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.
Az alábbi XML DML utasítás példái replace value of szemléltetik, hogyan lehet frissíteni a csomópontokat egy XML dokumentumban.
A. Értékek cseréje XML példányban
A következő példában egy dokumentumpéldányt először egy xml típusú változóhoz rendelünk. Ezután az replace value of XML DML utasítások frissítik az értékeket a dokumentumban.
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;
A frissítendő célpontnak legfeljebb egy olyan csomópontnak kell lennie, amelyet az útkimondásban kifejezetten meg van jelölve, hogy a kifejezés végén egy "[1]"-t adunk hozzá.
B. Az if kifejezést használjuk a helyettesítő érték meghatározásához
Megadhatod az if kifejezést az állítás 2replace value of. kifejezésében, ahogy az alábbi példa is mutatja. Az 1-es kifejezés azonosítja az LaborHours attribútumot az első munkaközpontból, amelyet frissíteni kell.
A 2-es kifejezés egy if kifejezést használ az attribútum új értékének LaborHours meghatározására.
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. XML frissítése, amely egy típus nélküli XML oszlopban tárolt
Az alábbi példa frissíti az XML-t egy oszlopban:
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. XML frissítése, amely egy gépelt XML oszlopban tárolt
Ez a példa egy gyártási utasítások dokumentumában található értékeket helyettesíti, amely egy gépelt XML oszlopban tárolt.
A példában először létrehozol egy táblát (T) egy gépelt XML oszloppal az AdventureWorks2025 adatbázisban. Ezután a tábla oszlopából InstructionsProductModel másolsz egy gyártási utasítás XML példányát a táblába T. Ezután az illesztéseket XML-re alkalmazzák a táblázatban 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;
Ez a példa az érték cseréjéhez cast használLotSize.
cast akkor szükséges, ha az értéknek egy adott típusúnak kell lennie. Ebben a példában, ha 500 az érték, akkor explicit varázslás nem szükséges.