ganti nilai (XML DML)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Memperbarui nilai simpul dalam dokumen.

Sintaksis

replace value of Expression1   
with Expression2  

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

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() akan digunakan secara implisit. Jika nilai adalah daftar nilai, pernyataan pembaruan menggantikan nilai lama dengan daftar. Dalam memodifikasi instans XML yang ditik, Expression2 harus berjenis yang sama atau subjenis Ekspresi1. Jika tidak, kesalahan dikembalikan. Dalam memodifikasi instans XML yang tidak dititik, Expression2 harus merupakan ekspresi yang dapat diatomisasi. Jika tidak, kesalahan dikembalikan.

Contoh

Contoh berikut dari nilai ganti pernyataan XML DML 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, ganti nilai 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. Menggunakan ekspresi if untuk menentukan nilai pengganti

Anda dapat menentukan ekspresi if di Ekspresi2 dari nilai pengganti pernyataan XML DML , seperti yang diperlihatkan dalam contoh berikut. Expression1 mengidentifikasi atribut LaborHours dari pusat kerja pertama adalah diperbarui. Expression2 menggunakan ekspresi if untuk menentukan nilai baru atribut LaborHours.

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 dititik

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 dititik

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 di database AdventureWorks. Anda kemudian menyalin instans XML instruksi manufaktur dari kolom Instruksi dalam tabel ProductModel 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="https://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="https://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="https://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  

Perhatikan penggunaan cast saat mengganti nilai LotSize. Ini diperlukan ketika nilai harus dari jenis tertentu. Dalam contoh ini, jika 500 adalah nilainya, transmisi eksplisit tidak akan diperlukan.

Lihat Juga

Membandingkan XML Yang Dititik dengan XML Yang Tidak Dititik
Membuat Instans Data XML
Metode Tipe Data xml
Bahasa Modifikasi Data XML (XML DML)