Wstaw (XML DML)
Wstawia jeden lub więcej węzłów, identyfikowane przez Expression1 jako węzły podrzędność lub równorzędne węzła identyfikowane przez Expression2.
Składnia
insert
Expression1 (
{as first | as last} into | after | before
Expression2
)
Argumenty
Expression1
Identyfikuje jeden lub więcej węzłów do wstawienia.Może to być stała XML wystąpienie; Odwołanie do wpisywanych danych XML wpisz wystąpienie tego samego schematu XML kolekcja na którym Modyfikuj metoda jest stosowana; Typ bez typu danych XML wystąpienie przy użyciu autonomicznego sql:column()/sql:variable() funkcja; lub XQuery wyrażenie.wyrażenie może spowodować w węźle i węzeł tekstowy lub uporządkowana sekwencja węzłów.Nie można rozpoznać węzeł główny (/).Jeśli wyrażenie wyniki w wartości lub sekwencja wartości, wartości są wstawiane jako węzeł jednolity tekst ze spacją oddzielającą każdej wartości w sekwencji.Jeśli określono wiele węzłów jako stała, węzły są zawarte w nawiasach i są oddzielone przecinkami.Nie można wstawić sekwencji heterogenicznych, takich jak kolejność elementów, atrybutów i wartości.Jeśli Expression1 jest rozpoznawany jako pusty sekwencji, odbywa się nie wstawiania i są zwracane żadne błędy.do
Węzły identyfikowane przez Expression1 są wstawiane jako bezpośrednie potomkami (węzłypodrzędność ) węzła identyfikowane przez Expression2.Jeśli węzeł w Expression2 ma już jeden lub więcej węzłów podrzędność , należy użyć albo jako pierwszy lub ostatnio można określić, gdzie nowy węzeł dodane.Na przykład na początku lub na końcu listy podrzędność odpowiednio.Jako pierwszy i ostatnio słowa kluczowe są ignorowane podczas wstawiania atrybutów.Po
Węzły identyfikowane przez Expression1 są wstawiane jako elementy równorzędne bezpośrednio po węzła identyfikowane przez Expression2.Po nie można użyć słowa kluczowego do wstawiania atrybutów.Na przykład nie można używać, Wstaw Konstruktor atrybut lub zwrócona atrybut XQuery.przed
Węzły identyfikowane przez Expression1 są wstawiane jako elementy równorzędne bezpośrednio przed węzła identyfikowane przez Expression2.Przed podczas wstawiania atrybutów nie można użyć słowa kluczowego.Na przykład nie można używać, Wstaw Konstruktor atrybut lub zwrócona atrybut XQuery.Expression2
Identyfikuje węzeł.Węzły w Expression1 dodaje węzeł identyfikowane przez Expression2.Może to być XQuery wyrażenie , które zwraca odwołanie do węzła, który istnieje w dokumencie aktualnie odwołanie.Jeśli zwracany jest więcej niż jeden węzeł insert nie powiedzie się.Jeśli Expression2 zwraca pusty, nie wstawiania sekwencja i błędy nie są zwracane.Jeśli Expression2 statycznie nie jest pojedyncza, zwracany jest błąd statycznych.Expression2nie może być instrukcją przetwarzania, komentarz lub atrybut.Należy zauważyć, że Expression2 musi być odwołaniem do istniejących węzła w dokumencie i nie konstruowanej węzła.
Przykłady
A.Wstawianie elementu węzły do dokumentu
Poniższy przykład ilustruje sposób wstawiania elementów do dokumentu.Po pierwsze, dokument XML jest przypisana do zmiennej xml typu.Następnie za pomocą kilku Wstaw XML DML sprawozdania przykład ilustruje sposób wstawiania węzły elementów w dokumencie.Po wstawieniu każda instrukcja SELECT wyświetla wyniki.
USE AdventureWorks2008R2;
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
Należy zauważyć, że różnych wyrażeń ścieżka w tym przykładzie określić "[1]" jako wymóg wpisywania tras statycznych.Dzięki temu węzła pojedynczego miejsce docelowe .
B.Wstawianie wielu elementów w dokumencie
W poniższym przykładzie dokument jest najpierw przypisany do zmiennej xml typu.Sekwencja dwóch elementów, reprezentujących funkcji produktu zostanie przypisana do zmiennej drugi xml typu.Ta sekwencja zostanie wstawiony na pierwszym zmiennej.
USE AdventureWorks2008R2;
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.Wstawianie atrybuty do dokumentu
Poniższy przykład ilustruje, jak atrybuty są wstawiane w dokumencie.Po pierwsze, dokument jest przypisany do xml typu zmiennej.Następnie serii Wstaw XML DML instrukcji jest używany do wstawiania atrybutów do dokumentu.Po wstawieniu każdego atrybut instrukcja SELECT wyświetla wyniki.
USE AdventureWorks2008R2;
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.Wstawianie węzła komentarz
W tej kwerendzie dokument XML jest najpierw przypisany do zmiennej xml typu.Następnie XML DML jest używany do wstawiania węzła komentarza po pierwszym <step> element.
USE AdventureWorks2008R2;
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.Wstawiając instrukcję przetwarzania
W następującej kwerendzie dokument XML jest najpierw przypisany do zmiennej xml typu.Następnie słowo kluczowe XML DML jest używany do wstawiania instrukcji przetwarzania na początku dokumentu.
USE AdventureWorks2008R2;
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.Wstawianie danych za pomocą sekcji CDATA
Po wstawieniu tekstu, który zawiera znaki, które nie są prawidłowe w formacie XML, takich jak < lub >, aby wstawić dane, jak pokazano w następującej kwerendzie można użyć sekcji CDATA.Kwerendy określa sekcja CDATA, ale jest dodawana jako węzeł tekstowy o nieprawidłowych znaków konwertowane na podmioty.Na przykład "<" zapisany jako <.
USE AdventureWorks2008R2;
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
Kwerenda wstawia tekst węzła do <Features> element:
<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> <notxml> as text </notxml> or cdata </Features>
</ProductDescription>
</Root>
G.Wstawianie tekstu węzła
W tej kwerendzie dokument XML jest najpierw przypisany do zmiennej xml typu.Następnie XML DML jest używany do wstawiania węzeł tekstowy jako pierwsze podrzędność <Root> element.Konstruktor tekst jest używany do określania tekstu.
USE AdventureWorks2008R2;
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.Wstawianie nowego elementu xml bez typu kolumna
Poniższy przykład dotyczy XML DML zaktualizować XML wystąpienie , przechowywane w xml kolumnawpisz:
USE AdventureWorks2008R2;
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
Ponownie, gdy <Material> dodaje węzeł elementu, ścieżka wyrażenie musi zwracać jeden miejsce docelowe.Jest to wyraźnie określone przez dodanie na końcu wyrażenie[1].
-- check the update
SELECT x.query(' //ProductDescription/Features')
FROM T;
GO
I.Wstawianie oparte na if warunek instrukcja
W następującym przykładzie określono warunek IF jako część wyrażenie1 w Wstaw XML DML instrukcja.Jeśli warunek ma wartość PRAWDA, atrybut jest dodawany do <WorkCenter> element.
USE AdventureWorks2008R2;
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
Poniższy przykład jest podobna, chyba że Wstaw XML DML instrukcja wstawia element w dokumencie, jeśli warunek ma wartość PRAWDA.Oznacza to, że jeśli <WorkCenter> element ma mniej niż lub równa się dwa <step>elementówpodrzędność .
USE AdventureWorks2008R2;
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
Jest to wynikiem:
<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.Wstawianie węzłów xml maszynowy kolumna
W tym przykładzie wstawia element i atrybut do instrukcji wytwarzania XML przechowywane w maszynowy xml kolumna.
W przykładzie, należy najpierw utworzyć tabela (T) z wpisaną xml kolumna, w AdventureWorks2008R2 bazy danych.Następnie skopiuj wytwarzania instrukcje XML wystąpienie z instrukcjami kolumna ProductModel tabela do tabela T.Wstawienia są stosowane do pliku XML w tabela T.
USE AdventureWorks2008R2;
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