ganti nilai (XML DML)
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Memperbarui nilai simpul dalam dokumen.
Sintaks
replace value of Expression1
with Expression2
Argumen
Ekspresi1
Mengidentifikasi simpul yang nilainya akan diperbarui. Ini harus mengidentifikasi hanya satu simpul. Artinya, Ekspresi1 harus berupa singleton statis. Jika XML dititik, jenis simpul harus berupa jenis sederhana. Ketika beberapa simpul dipilih, kesalahan dimunculkan. Jika Ekspresi1 mengembalikan urutan kosong, tidak ada penggantian nilai yang terjadi dan tidak ada kesalahan yang dikembalikan. Ekspresi1 harus mengembalikan elemen tunggal yang memiliki konten tipe sederhana (daftar atau jenis atomik), simpul teks, atau node atribut. Ekspresi1 tidak boleh berupa jenis gabungan, jenis kompleks, instruksi pemrosesan, simpul dokumen, atau simpul komentar, atau kesalahan dikembalikan.
Ekspresi2
Mengidentifikasi nilai baru simpul. Ini bisa menjadi ekspresi yang mengembalikan node jenis sederhana, karena data()
digunakan secara implisit. Jika nilai adalah daftar nilai, update
pernyataan akan menggantikan nilai lama dengan daftar. Saat Anda memodifikasi instans XML yang ditik, Expression2 harus berjenis yang sama atau subjenis Ekspresi1. Jika tidak, kesalahan dikembalikan. Saat Anda memodifikasi instans XML yang tidak dititik, Expression2 harus berupa ekspresi yang dapat diatomisasi. Jika tidak, kesalahan dikembalikan.
Contoh
Sampel kode Transact-SQL dalam artikel ini menggunakan AdventureWorks2022
database sampel atau AdventureWorksDW2022
, yang dapat Anda unduh dari halaman beranda Sampel Microsoft SQL Server dan Proyek Komunitas.
Contoh replace value of
pernyataan XML DML berikut mengilustrasikan cara memperbarui simpul dalam dokumen XML.
J. Mengganti nilai dalam instans XML
Dalam contoh berikut, instans dokumen pertama kali ditetapkan ke variabel jenis xml . Kemudian, replace value of
pernyataan XML DML memperbarui nilai dalam dokumen.
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;
Target yang diperbarui harus, paling banyak, satu simpul yang secara eksplisit ditentukan dalam ekspresi jalur dengan menambahkan "[1]" di akhir ekspresi.
B. Gunakan ekspresi if untuk menentukan nilai penggantian
Anda dapat menentukan if
ekspresi dalam Ekspresi2 pernyataan, seperti yang replace value of
diperlihatkan dalam contoh berikut. Ekspresi1 mengidentifikasi LaborHours
atribut dari pusat kerja pertama akan diperbarui. Expression2 menggunakan if
ekspresi untuk menentukan nilai LaborHours
baru atribut.
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. Memperbarui XML yang disimpan dalam kolom XML yang tidak dititip
Contoh berikut memperbarui XML yang disimpan dalam kolom:
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. Memperbarui XML yang disimpan dalam kolom XML yang ditik
Contoh ini menggantikan nilai dalam dokumen instruksi manufaktur yang disimpan dalam kolom XML yang ditik.
Dalam contoh, Anda terlebih dahulu membuat tabel (T
) dengan kolom XML yang ditik dalam AdventureWorks2022
database. Anda kemudian menyalin instans XML instruksi manufaktur dari Instructions
kolom dalam ProductModel
tabel ke dalam tabel T
. Penyisipan kemudian diterapkan ke XML dalam 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;
Contoh ini digunakan cast
saat mengganti LotSize
nilai. cast
diperlukan ketika nilai harus dari jenis tertentu. Dalam contoh ini, jika 500
adalah nilainya, transmisi eksplisit tidak diperlukan.