Ekle (XML DML)
Tanımlanan bir veya daha fazla düğüm ekler Expression1 alt düğümlerin ya da eşdüzey düğüm tarafından tanımlanan Expression2.
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.Bunun olması sabit bir XML örnek; bir başvuru üzerinde değiştirme yöntem uygulanan; XML Şeması aynı koleksiyonun yazılan bir XML veri türü örnek için tek başına bir kullanarak bir türlenmemiş XML veri türü örnek sql:column()/sql:variable() işlev; veya XQuery ifade. Ifade bir düğüm aynı zamanda bir metin düğümü veya düğümlerin sıralı bir dizi sonuçlanabilir.Bu, kök (/) düğüme çözümlenemiyor.Ifade, bir değer ya da değerler dizisi sonuçlanırsa, değerler, sıradaki her değeri ayırmak için bir alan ile bir tek metin düğümü eklenir.Birden çok düğüm sabit olarak belirtirseniz, düğümlerin parantez içinde bulunan ve noktalı virgülle ayrılır.Öğeleri, öznitelikleri ve değerleri dizisi gibi heterojen serilerini eklenemiyor.If Expression1 boş bir sıra giderir, hiçbir ekleme oluşur ve bir hata döndürülür.içine
Düğümler tarafından tanımlanır. Expression1 doğrudan descendents (alt düğümlerin) tarafından tanımlanan düğüm eklenir Expression2. Varsa, düğümü Expression2 zaten bir veya daha fazla alt düğümleri vardır, ya da kullanmanız gerekir olarak ilk or olarak son eklenen yeni bir düğüm istediğiniz belirtmek için.Örneğin, başlangıç sırasında veya alt listenin sonundaki sırasıyla.The as first and as last keywords are ignored when attributes are inserted.sonra
Düğümler tarafından tanımlanır. Expression1 doğrudan eşi tanımlanan düğüm sonra eklenir Expression2. The after keyword cannot be used to insert attributes.Örneğin, bir öznitelik oluşturucu ekleyin ya da öznitelik bir XQuery dönmek için kullanılamaz.önce
Düğümler tarafından tanımlanır. Expression1 Eşdüzey doğrudan tarafından tanımlanan düğüm önce eklenir Expression2. The before keyword cannot be used when attributes are being inserted.Örneğin, bir öznitelik oluşturucu ekleyin ya da öznitelik bir XQuery dönmek için kullanılamaz.Expression2
Bir düğüm tanımlar.Tanımlanan düğüm Expression1 göreceli olarak tanımlanan bir düğüm eklenir Expression2. Bu, şu anda referansta bulunulan belge içinde var olan bir düğüm için bir başvuru veren XQuery ifade geçersiz olabilir.Birden fazla düğüm döndürülürse, ekleme başarısız.If Expression2 boş bir sıra, hiçbir ekleme oluşuyor verir ve herhangi bir hata döndürdü. If Expression2 is statically not a singleton, a static error is returned.Expression2 cannot be a processing instruction, comment, or attribute.Dikkat Expression2 Varolan bir belgeyi düğümünde ve oluşturulmuş bir düğüm için bir başvuru olmalıdır.
Örnekler
C.Öğe düğümleri belgeye ekleme
Aşağıdaki örnek, bir belgenin içine öğe eklemek verilmektedir.Ilk olarak, bir XML belgesi için bir değişken atanan XML türü.Sonra birkaç ekleme Nasıl öğe düğümleri, belgeye eklenmiş örnek XML DML deyimlerini göstermektedir.Sonra her ekleme, SELECT deyim 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
Bu örnekte tüm yol ifadelerinde, "[1]" belirtmek statik her yazım gereksinim olarak unutmayın.Bu, tek bir hedef düğüm sağlar.
b.Birden çok öğe belgeye ekleme
Aşağıdaki örnekte, belgenin atandığı bir değişken için xml yazın. Sonra iki öğe, ürün özellikleri gösteren bir dizi ikinci bir değişkene atanır. xml yazın. Bu sıralama, ardından ilk değişken 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
c.Öznitelikleri belgeye ekleme
Öznitelikleri bir document.First nasıl eklenir, aşağıdaki örnekte gösterilmektedir, belgenin atandığı bir XML türü değişkeni.Sonra bir dizi ekleme XML DML deyimlerini öznitelikleri belgeye eklemek için kullanılır.Her öznitelik ekleme sonra SELECT deyiminin sonuç 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
d.Bir açıklama düğümü ekleme
Bu sorgu, bir XML belgesi atandığı bir değişken için XML türü.Daha sonra XML DML sonra ilk düğüm açıklama eklemek için kullanılır <step> öğe.
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.Bir işlem yönergesi ekleme
Aşağıdaki sorguda, bir XML belgesi ilk değişken için atanan XML türü.Daha sonra XML DML anahtar sözcüğü belgenin başlangıcında bir işlem yönergesi 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
f.Bir CDATA bölümü kullanarak veri ekleme
Gibi XML'DE geçerli olmayan karakterleri içeren metin eklediğinizde < veya >, aşağıdaki sorguda gösterilen verileri eklemek için CDATA bölümleri kullanabilirsiniz. Sorgu bir CDATA bölümü belirtir, ancak bu geçersiz karakterleri varlıklara dönüştürülmüş olan bir metin düğümü eklenir.Örneğin, '<' olarak kaydedildi <.
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ü içine ekler <Features> öğe:
<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> <notxml> as text </notxml> or cdata </Features>
</ProductDescription>
</Root>
g.Metin düğümü ekleme
Bu sorgu, bir XML belgesi atandığı bir değişken için XML türü.Sonra XML DML ilk alt olarak bir metin düğümü eklemek için kullanılan <Root> öğe. Metin kurucu 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
h.Yeni bir öğe türlenmemiş bir xml ekleme sütun
Aşağıdaki örnek XML DML, depolanan bir XML örneği güncelleştirmek için geçerli bir XML türü sütun:
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
Yeniden açtığınızda, <Material> öğe düğümü eklenir, yol ifadesi, tek bir hedef döndürmelidir. Bu açıkça [1] ekleyerek ifade sonunda belirtildi.
-- check the update
SELECT x.query(' //ProductDescription/Features')
FROM T;
GO
İ.Temel alan bir açıksa ekleme deyim koşul
Aşağıdaki örnekte, bir IF koşulu ifade1 bir parçası olarak belirtilen ekleme XML DML ekstresi.Durum değeri TRUE ise, öznitelik eklenen <WorkCenter> öğe.
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 ekleme XML DML deyim koşul true ise, belgede bir öğe ekler.Diğer bir deyişle, <WorkCenter> öğenin küçüktür veya iki eşittir <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
Bu sonucu oluşur:
<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.Düğümlerin yazılı xml sütun ekleme
Bu örnek XML yazılı saklanan bir üretim yönergeleri bir öğe ve öznitelik ekler XML sütun.
Örnekte, ilk tablo (T) yazılı bir oluşturma XML sütun, AdventureWorks veritabanındaki.Bir üretim kopyalamadan sonra gelen yönergeler yönergeleri XML örnek sütun T. tabloya ProductModel tablosundakiEklenenleri sonra tablo T. XML'DE 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