sisipkan (XML DML)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Menyisipkan satu atau beberapa simpul yang diidentifikasi oleh Ekspresi1 sebagai simpul turunan atau saudara kandung dari simpul yang diidentifikasi oleh Ekspresi2.

Sintaksis

insert Expression1 (  
{as first | as last} into | after | before  
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 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 &lt;.

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> &lt;notxml@gt; as text &lt;/notxml&gt; 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)