Bagikan melalui


ganti nilai (XML DML)

Berlaku untuk: SQL ServerAzure SQL Database Azure 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() 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.