sisipkan (XML DML)
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Menyisipkan satu atau beberapa simpul yang diidentifikasi oleh Ekspresi1 sebagai simpul turunan atau saudara kandung dari simpul yang diidentifikasi oleh Ekspresi2.
Sintaks
insert Expression1 (
{as first | as last} into | after | before
Expression2
)
Argumen
Ekspresi1
Mengidentifikasi satu atau beberapa simpul untuk disisipkan. Ini bisa menjadi instans XML konstan; referensi ke instans jenis data XML yang diketik dari koleksi Skema XML yang sama tempat metode modifikasi diterapkan; instans jenis data XML yang tidak diketik menggunakan fungsi sql:column()/sql:variable() yang tidak diketik; atau ekspresi XQuery. Ekspresi dapat menghasilkan simpul, dan juga simpul teks, atau dalam urutan simpul yang diurutkan. Ini tidak dapat mengatasi node root (/). Jika ekspresi menghasilkan nilai atau urutan nilai, nilai disisipkan sebagai simpul teks tunggal dengan spasi yang memisahkan setiap nilai dalam urutan. Jika Anda menentukan beberapa simpul sebagai konstanta, simpul disertakan dalam tanda kurung dan dipisahkan oleh koma. Anda tidak dapat menyisipkan urutan heterogen seperti urutan elemen, atribut, atau nilai. Jika Ekspresi1 menyelesaikan urutan kosong, tidak ada penyisipan yang terjadi dan tidak ada kesalahan yang dikembalikan.
into
Simpul yang diidentifikasi oleh Ekspresi1 disisipkan sebagai turunan langsung (simpul anak) dari simpul yang diidentifikasi oleh Ekspresi2. Jika simpul di Ekspresi2 sudah memiliki satu atau beberapa simpul anak, Anda harus menggunakan sebagai pertama atau terakhir untuk menentukan di mana Anda ingin simpul baru ditambahkan. Misalnya, di awal atau di akhir daftar anak, masing-masing. Kata kunci pertama dan terakhir diabaikan saat atribut disisipkan.
setelah
Simpul yang diidentifikasi oleh Ekspresi1 disisipkan sebagai saudara kandung langsung setelah simpul yang diidentifikasi oleh Ekspresi2. Kata kunci setelah tidak dapat digunakan untuk menyisipkan atribut. Misalnya, ini tidak dapat digunakan untuk menyisipkan konstruktor atribut atau untuk mengembalikan atribut dari XQuery.
sebelumnya
Simpul yang diidentifikasi oleh Ekspresi1 disisipkan sebagai saudara kandung secara langsung sebelum simpul yang diidentifikasi oleh Ekspresi2. Kata kunci sebelum tidak dapat digunakan ketika atribut sedang disisipkan. Misalnya, ini tidak dapat digunakan untuk menyisipkan konstruktor atribut atau untuk mengembalikan atribut dari XQuery.
Ekspresi2
Mengidentifikasi simpul. Simpul yang diidentifikasi dalam Ekspresi1 disisipkan relatif terhadap simpul yang diidentifikasi oleh Ekspresi2. Ini bisa menjadi ekspresi XQuery yang mengembalikan referensi ke simpul yang ada di dokumen yang saat ini direferensikan. Jika lebih dari satu simpul dikembalikan, penyisipan gagal. Jika Ekspresi2 mengembalikan urutan kosong, tidak ada penyisipan yang terjadi dan tidak ada kesalahan yang dikembalikan. Jika Ekspresi2 secara statis bukan singleton, kesalahan statis dikembalikan. Ekspresi2 tidak boleh berupa instruksi pemrosesan, komentar, atau atribut. Perhatikan bahwa Ekspresi2 harus menjadi referensi ke simpul yang ada dalam dokumen dan bukan simpul yang dibangun.
Contoh
J. Menyisipkan simpul elemen ke dalam dokumen
Contoh berikut mengilustrasikan cara menyisipkan elemen ke dalam dokumen. Pertama, dokumen XML ditetapkan ke variabel jenis xml . Kemudian, melalui beberapa pernyataan sisipkan XML DML, contoh menggambarkan bagaimana simpul elemen disisipkan dalam dokumen. Setelah setiap sisipan, pernyataan SELECT menampilkan hasilnya.
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
</Features>
</ProductDescription>
</Root>' ;
SELECT @myDoc;
-- insert first feature child (no need to specify as first or as last)
SET @myDoc.modify('
insert <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
into (/Root/ProductDescription/Features)[1]') ;
SELECT @myDoc ;
-- insert second feature. We want this to be the first in sequence so use 'as first'
SET @myDoc.modify('
insert <Warranty>1 year parts and labor</Warranty>
as first
into (/Root/ProductDescription/Features)[1]
') ;
SELECT @myDoc ;
-- insert third feature child. This one is the last child of <Features> so use 'as last'
SELECT @myDoc
SET @myDoc.modify('
insert <Material>Aluminium</Material>
as last
into (/Root/ProductDescription/Features)[1]
')
SELECT @myDoc ;
-- Add fourth feature - this time as a sibling (and not a child)
-- 'after' keyword is used (instead of as first or as last child)
SELECT @myDoc ;
SET @myDoc.modify('
insert <BikeFrame>Strong long lasting</BikeFrame>
after (/Root/ProductDescription/Features/Material)[1]
') ;
SELECT @myDoc;
GO
Perhatikan bahwa berbagai ekspresi jalur dalam contoh ini menentukan "[1]" sebagai persyaratan pengetikan per statis. Ini memastikan satu simpul target.
B. Menyisipkan beberapa elemen ke dalam dokumen
Dalam contoh berikut, dokumen pertama kali ditetapkan ke variabel jenis xml . Kemudian, urutan dua elemen, yang mewakili fitur produk, ditetapkan ke variabel kedua jenis xml . Urutan ini kemudian dimasukkan ke dalam variabel pertama.
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc = N'<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> </Features>
</ProductDescription>
</Root>';
DECLARE @newFeatures xml;
SET @newFeatures = N'<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>';
-- insert new features from specified variable
SET @myDoc.modify('
insert sql:variable("@newFeatures")
into (/Root/ProductDescription/Features)[1] ')
SELECT @myDoc;
GO
C. Menyisipkan atribut ke dalam dokumen
Contoh berikut mengilustrasikan bagaimana atribut disisipkan dalam dokumen. Pertama, dokumen ditetapkan ke variabel jenis xml . Kemudian, serangkaian pernyataan sisipkan XML DML digunakan untuk menyisipkan atribut ke dalam dokumen. Setelah setiap penyisipan atribut, pernyataan SELECT menampilkan hasilnya.
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc =
'<Root>
<Location LocationID="10" >
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>' ;
SELECT @myDoc;
-- insert LaborHours attribute
SET @myDoc.modify('
insert attribute LaborHours {".5" }
into (/Root/Location[@LocationID=10])[1] ');
SELECT @myDoc;
-- insert MachineHours attribute but its value is retrieved from a sql variable @Hrs
DECLARE @Hrs FLOAT;
SET @Hrs =.2;
SET @myDoc.modify('
insert attribute MachineHours {sql:variable("@Hrs") }
into (/Root/Location[@LocationID=10])[1] ');
SELECT @myDoc;
-- insert sequence of attribute nodes (note the use of ',' and ()
-- around the attributes.
SET @myDoc.modify('
insert (
attribute SetupHours {".5" },
attribute SomeOtherAtt {".2"}
)
into (/Root/Location[@LocationID=10])[1] ');
SELECT @myDoc;
GO
D. Menyisipkan simpul komentar
Dalam kueri ini, dokumen XML pertama kali ditetapkan ke variabel jenis xml . Kemudian, XML DML digunakan untuk menyisipkan simpul komentar setelah elemen pertama <step
> .
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc =
'<Root>
<Location LocationID="10" >
<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('
insert <!-- some comment -->
after (/Root/Location[@LocationID=10]/step[1])[1] ');
SELECT @myDoc;
GO
E. Menyisipkan instruksi pemrosesan
Dalam kueri berikut, dokumen XML pertama kali ditetapkan ke variabel jenis xml . Kemudian, kata kunci XML DML digunakan untuk menyisipkan instruksi pemrosesan di awal dokumen.
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc =
'<Root>
<Location LocationID="10" >
<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('
insert <?Program = "Instructions.exe" ?>
before (/Root)[1] ') ;
SELECT @myDoc ;
GO
F. Menyisipkan data menggunakan bagian CDATA
Saat Anda menyisipkan teks yang menyertakan karakter yang tidak valid di XML, seperti < atau >, Anda bisa menggunakan bagian CDATA untuk menyisipkan data seperti yang diperlihatkan dalam kueri berikut. Kueri menentukan bagian CDATA, tetapi ditambahkan sebagai simpul teks dengan karakter yang tidak valid yang dikonversi ke entitas. Misalnya, <
disimpan sebagai <
.
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc =
'<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> </Features>
</ProductDescription>
</Root>' ;
SELECT @myDoc ;
SET @myDoc.modify('
insert <![CDATA[ <notxml> as text </notxml> or cdata ]]>
into (/Root/ProductDescription/Features)[1] ') ;
SELECT @myDoc ;
GO
Kueri menyisipkan simpul teks ke <Features
> dalam elemen:
<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> <notxml@gt; as text </notxml> or cdata </Features>
</ProductDescription>
</Root>
G. Menyisipkan simpul teks
Dalam kueri ini, dokumen XML pertama kali ditetapkan ke variabel jenis xml . Kemudian, XML DML digunakan untuk menyisipkan simpul teks sebagai anak pertama dari <Root
> elemen. Konstruktor teks digunakan untuk menentukan teks.
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc;
SET @myDoc.modify('
insert text{"Product Catalog Description"}
as first into (/Root)[1]
');
SELECT @myDoc;
H. Menyisipkan elemen baru ke dalam kolom xml yang tidak dititik
Contoh berikut menerapkan XML DML untuk memperbarui instans XML yang disimpan dalam kolom jenis xml :
USE AdventureWorks;
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
-- insert a new element
UPDATE T
SET x.modify('insert <Material>Aluminium</Material> as first
into (/Root/ProductDescription/Features)[1]
');
GO
Sekali lagi, ketika simpul <Material
> elemen disisipkan, ekspresi jalur harus mengembalikan satu target. Ini secara eksplisit ditentukan dengan menambahkan [1] di akhir ekspresi.
-- check the update
SELECT x.query(' //ProductDescription/Features')
FROM T;
GO
I. Menyisipkan berdasarkan pernyataan kondisi if
Dalam contoh berikut, kondisi IF ditentukan sebagai bagian dari Ekspresi1 dalam pernyataan sisipkan XML DML. Jika kondisinya True, atribut ditambahkan ke <WorkCenter
> elemen .
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc =
'<Root>
<Location LocationID="10" LaborHours="1.2" >
<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('
insert
if (/Root/Location[@LocationID=10])
then attribute MachineHours {".5"}
else ()
as first into (/Root/Location[@LocationID=10])[1] ');
SELECT @myDoc;
GO
Contoh berikut serupa, kecuali pernyataan sisipkan XML DML menyisipkan elemen dalam dokumen jika kondisinya Benar. Artinya, jika <WorkCenter
> elemen memiliki kurang dari atau sama dengan dua <step
> elemen anak.
USE AdventureWorks;
GO
DECLARE @myDoc XML;
SET @myDoc =
'<Root>
<Location LocationID="10" LaborHours="1.2" >
<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('
insert
if (count(/Root/Location/step) <= 2)
then element step { "This is a new step" }
else ()
as last into (/Root/Location[@LocationID=10])[1] ');
SELECT @myDoc;
GO
Ini adalah hasilnya:
<Root>
<WorkCenter WorkCenterID="10" LaborHours="1.2">
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
<step>This is a new step</step>
</WorkCenter>
j. Menyisipkan simpul dalam kolom xml yang ditik
Contoh ini menyisipkan elemen dan atribut ke dalam XML 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 AdventureWorks;
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
SELECT Instructions
FROM T;
-- now insertion begins
--1) insert a new manu. Location. The <Root> specified as
-- expression 2 in the insert() must be singleton.
UPDATE T
SET Instructions.modify('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
insert <MI:Location LocationID="1000" >
<MI:step>New instructions go here</MI:step>
</MI:Location>
as first
into (/MI:root)[1]
') ;
SELECT Instructions
FROM T ;
-- 2) insert attributes in the new <Location>
UPDATE T
SET Instructions.modify('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
insert attribute LaborHours { "1000" }
into (/MI:root/MI:Location[@LocationID=1000])[1] ');
GO
SELECT Instructions
FROM T ;
GO
--cleanup
DROP TABLE T ;
GO
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)