Aracılığıyla paylaş


(xml dml) Ekle

Tanımlanan bir veya daha fazla düğüm ekler Expression1alt düğümler ya da kardeşleri tarafından tanımlanan düğüm Expression2.

Sözdizimi

insert 
      Expression1 (
                 {as first | as last} into | after | before
                                    Expression2
                )

Bağımsız değişkenler

  • Expression1
    Bir veya daha fazla düğüm eklemek için tanımlar. Bu sürekli bir xml örneği olabilir; Yazılı xml veri türü örneği değiştirme yöntemi uygulanmakta olan aynı xml şema koleksiyonu bir başvuru; tek başına yazılmamış xml veri türü örneğini kullanarak sql:column()/ sql:variable() fonksiyonu; veya XQuery ifade. İfade bir düğüm ve metin düğümü veya düğümleri sıralı bir dizi neden olabilir. Kök (/) düğüm çözülemiyor. İfadenin değeri ya da değerler dizisi kaynaklanıyorsa, değerler dizisindeki her değeri ayıran bir boşluk tek metin düğümü eklenir. Birden çok düğüm sabit olarak belirtirseniz, düğümleri ve parantez içinde dahil virgüllerle ayrılır. Öğeleri, öznitelikleri ya da değerler dizisi gibi heterojen dizileri ekleyemezsiniz. Eğer Expression1çözümler için boş sırası, hiçbir ekleme oluşur ve herhangi bir hata döndürülmez.

  • içine
    Tarafından tanımlanan düğüm Expression1doğrudan descendents (alt düğümler) tarafından tanımlanan düğüm olarak eklenen Expression2. Eğer düğüm Expression2zaten bir veya daha fazla alt düğümleri vardır, ya da kullanmak gerekir ilk olarak veya son olarak eklenen yeni bir düğüm istediğiniz yeri belirtmek için. Örneğin, başlangıç veya çocuk listenin sonuna sırasıyla. İlk olarak ve son olarak öznitelikleri eklendiğinde anahtar sözcükler yoksayılır.

  • sonra
    Tarafından tanımlanan düğüm Expression1kardeşler tarafından tanımlanan düğüm sonra doğrudan olarak eklenen Expression2. Sonra anahtar öznitelikleri eklemek için kullanılamaz. Örneğin, bir öznitelik oluşturucu eklemek ya da öznitelik bir XQuery dönmek için kullanılamaz.

  • önce
    Tarafından tanımlanan düğüm Expression1kardeşler önce doğrudan tarafından tanımlanan düğüm olarak eklenen Expression2. Önce anahtar öznitelikleri eklendiğinde kullanılamaz. Örneğin, bir öznitelik oluşturucu eklemek ya da öznitelik bir XQuery dönmek için kullanılamaz.

  • Expression2
    Bir düğümü tanımlar. Tanımlanan düğümleri Expression1tarafından tanımlanan düğüm göreli olarak eklenen Expression2. Bu, şu anda bulunulan belgede bulunan düğüm bir başvuru verir XQuery ifade olabilir. Birden fazla düğüm döndürülür ekleme başarısız olur. Eğer Expression2döner boş sırası, hiçbir ekleme oluşur ve herhangi bir hata döndürülür. Eğer Expression2statik bir singleton değil statik bir hata döndürdü. Expression2işlem yönergesi, açıklama veya özniteliği olamaz. Dikkat Expression2belgedeki mevcut bir düğüm ve inşa düğümü değil başvuru olmalı.

Örnekler

A.Öğe düğümleri belgeye ekleme

Aşağıdaki örnek, öğeleri belgeye eklemek üzere verilmektedir. İlk olarak, bir xml belgesinin bir değişkene atanır xml türü. Sonra birkaç üzerinden Ekle xml dml deyimlerini, örneği göstermektedir öğesi düğümleri belgedeki nasıl eklenir. Her Ekle sonra select deyimi sonucu görüntüler.

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

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

Not Bu örnekte çeşitli yol ifadeleri "[1]" belirtin bir statik başına yazma gereği. Bu, bir tek hedef düğüm sağlar.

B.Belge içine birden çok öğe ekleme

Aşağıdaki örnek, bir belgenin ilk bir değişkene atanır xmltürü. Ardından, ürün özellikleri, temsil eden iki unsur dizisi ikinci bir değişkenine atanır xmltürü. Bu dizi daha sonra ilk değişkenin eklenir.

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

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.Öznitelikler bir belgeye ekleme

Aşağıdaki örnekte gösterilmiştir: öznitelik belgede nasıl eklenir.İlk olarak, belgenin atandığı bir xml türü değişkeni. Sonra bir dizi Ekle xml dml deyimlerini öznitelikleri belgeye eklemek için kullanılır. Her öznitelik ekleme sonra select deyimi sonucu görüntüler.

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 retrived 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

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 retrived 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.Bir açıklama düğümü ekleme

Bu sorgu, bir xml belgesini ilk bir değişkene atanır xml türü. Sonra xml dml sonra ilk Açıklama düğüm eklemek için kullanılan <step> öğesi.

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

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.İşleme talimatı ekleme

Aşağıdaki sorgu, bir xml belgesini ilk bir değişkene atanır xml türü. Sonra xml dml anahtar, belgenin başında işleme talimatı eklemek için kullanılır.

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

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.Bir cdata bölümü kullanarak veri ekleme

Gibi XML'de geçerli olmayan karakterler içeren metin eklediğinizde < ya >, aşağıdaki sorgu gösterildiği gibi veri eklemek için cdata bölümleri kullanabilirsiniz. Sorgu bir cdata bölümü belirtir, ancak bu varlıklar için dönüştürülmüş geçersiz karakterler ile bir metin düğümü olarak eklenir. Örneğin, '<' olarak kaydedilir &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

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

Sorgu bir metin düğümü ekler <Features> öğesi:

<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> &lt;notxml&gt; as text &lt;/notxml&gt; or cdata </Features>
</ProductDescription>
</Root>     
<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> &lt;notxml&gt; as text &lt;/notxml&gt; or cdata </Features>
</ProductDescription>
</Root>     

G.Metin düğümü ekleme

Bu sorgu, bir xml belgesini ilk bir değişkene atanır xml türü. Sonra xml dml ilk alt metin düğümü eklemek için kullanılan <Root> öğesi. Metin Oluşturucu, metni belirlemek için kullanılır.

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

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.Yazılmamış xml sütuna yeni bir öğe ekleme

Aşağıdaki örnek geçerli güncelleştirme depolanan xml örneğine xml dml bir xml sütun türü:

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

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

Yine, ne zaman <Material> eleman düğümü eklenir, yol ifadesi tek bir hedef döndürmelidir. Bu açıkça bir [1] ekleyerek ifade sonunda belirtildi.

-- check the update
SELECT x.query(' //ProductDescription/Features')
FROM T;
GO

-- check the update
SELECT x.query(' //ProductDescription/Features')
FROM T;
GO

I.Ekleme dayalı bir if koşulu deyimi

Aşağıdaki örnekte, bir IF koşulu İfade1 içinde bir parçası olarak belirtilen Ekle xml dml deyimi. Koşul True ise, öznitelik eklenen <WorkCenter> öğesi.

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

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

Aşağıdaki örnek, benzer dışında Ekle xml dml deyimi ekler öğeyi belgede koşul doğru ise. Yani, eğer <WorkCenter> öğesinin az veya iki eşit <step> alt öğeleri.

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

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

Sonuç şudur:

<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>

<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.Yazılı xml sütun düğüm ekleme

Bu örnek bir öğe ve öznitelik xml yazılan içinde depolanan üretim yönergeleri ekler xml sütun.

Örnekte, önce bir tablo (t) bir Daktilo ile oluşturduğunuz xml AdventureWorks veritabanındaki sütun. Kopyalamadan sonra bir üretim yönergeleri xml örneği ProductModel tablosundaki yönergeleri sütun tablo t. Eklemeler için xml tablosuna t. uygulanır

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           
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           

Ayrıca bkz.

Kavramlar

Yazılı xml yazılmamış xml karşılaştırın

xml veri örnekleri oluşturma

xml veri değişikliği dili (xml dml)

Diğer Kaynaklar

XML veri türü yöntemleri