Udostępnij przez


insert (XML DML)

Wstawia jeden lub większą liczbę węzłów, identyfikowane przez Expression1 jako węzły podrzędność i równorzędne węzła, identyfikowane przez Expression2.

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

Argumenty

  • Expression1
    Określa jeden lub więcej węzłów do wstawienia.Może to być stała wystąpienie XML; odwołanie do określonego wystąpienia typu danych XML z tego samego zbioru schematu XML, na którym jest stosowana metoda modyfikacji; bez typu danych typu instancję XML przy użyciu autonomiczny sql:column()/sql:variable() Funkcja; lub wyrażenie XQuery. Wyrażenie może spowodować w węźle i węzeł tekstu lub w sekwencji uporządkowanej węzłów.Nie można go rozpoznać do węzła głównego (/).Jeśli wynikiem wyrażenie wartości lub ciąg wartości, wartości są wstawiane jako węzeł jeden tekst znakiem spacji oddzielający każdej wartości w sekwencji.Jeżeli podano wiele węzłów jako stała, węzły znajdują się 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 występuje nie wstawiania w miejscu, w tym artykule opisano sposób eliminowania do sekwencję puste, a błędy nie są zwracane.

  • do
    Węzły identyfikowane przez Expression1 są wstawiane jako bezpośrednie potomkami (węzły podrzędność) węzła, identyfikowane przez Expression2. Jeżeli w węźle Expression2 ma już jeden lub więcej węzłów podrzędność, należy użyć jako pierwszy or jako ostatnie , aby określić, gdzie nowy węzeł dodane.Na przykład na początku lub na końcu listy podrzędnej odpowiednio.The as first and as last keywords are ignored when attributes are inserted.

  • Po
    Węzły identyfikowane przez Expression1 dodaje się jako elementy równorzędne bezpośrednio po węzła, identyfikowane przez Expression2. The after keyword cannot be used to insert attributes.Na przykład nie można użyć, aby wstawić Konstruktor atrybut lub zwrócona XQuery atrybut.

  • przed
    Węzły identyfikowane przez Expression1 wstawiane są jako elementy równorzędne bezpośrednio przed węzła, identyfikowane przez Expression2. The before keyword cannot be used when attributes are being inserted.Na przykład nie można użyć, aby wstawić Konstruktor atrybut lub zwrócona XQuery atrybut.

  • Expression2
    Identyfikuje węzeł.Węzły w Expression1 dodaje się do węzła, identyfikowane przez Expression2. Może to być XQuery wyrażenie, które zwraca odwołanie do węzła, który występuje w dokumencie aktualnie do którego istnieje odwołanie.Jeśli zwracany jest więcej niż jeden węzeł, insert nie powiedzie się.Jeśli Expression2 Zwraca pusty sekwencji, nie wstawiania wystąpienia i błędy nie są zwracane. If Expression2 is statically not a singleton, a static error is returned.Expression2 cannot be a processing instruction, comment, or attribute.Należy zauważyć, że Expression2 musi być odwołanie do istniejącego węzeł w dokumencie i nie zbudowane węzła.

Przykłady

A.Wstawianie elementu węzłów do dokumentu

Poniższy przykład ilustruje sposób wstawiania elementów do dokumentu.Po pierwsze dokument XML jest przypisany do zmiennej XML typu.Następnie za pomocą kilku Wstawianie XML DML instrukcji w przykładzie pokazano, w jaki sposób element węzły są wstawiane w dokumencie.Po każdej wstawiania instrukcja SELECT wyświetla wyniki.

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

Należy zauważyć, że różne wyrażenia ścieżka w tym przykładzie określić "[1]" jako wymagania wpisywania na statyczne.Dzięki temu węzła jednego docelowego.

B.Wstawianie wielu elementów w dokumencie

W poniższym przykładzie dokument jest najpierw przypisany do zmiennej xml Typ. Sekwencję dwóch elementów, reprezentujący funkcji produktu zostanie przypisana do zmiennej drugi xml Typ. Tej sekwencji jest następnie wstawiany do pierwszego zmiennej.

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.Wstawianie atrybutów do dokumentu

Poniższy przykład ilustruje, jak atrybuty są wstawiane document.First, dokument jest przypisany do XML typu zmiennej.Następnie w serii Wstawianie Instrukcje XML DML jest używany do wstawiania atrybutów do dokumentu.Po wstawieniu każdego atrybut instrukcja SELECT wyświetla wyniki.

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.Wstawianie węzła komentarza

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 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.Wstawianie instrukcja 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 instrukcja przetwarzania na początku dokumentu.

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.Wstawianie danych za pomocą sekcja CDATA

Po wstawieniu tekstu zawierającego znaki, które nie są prawidłowe w formacie XML, takie jak < lub >, aby wstawić dane, jak pokazano na następującej kwerendy za pomocą sekcji CDATA. Kwerendy określa, że sekcja CDATA, ale jest dodawany jako węzeł tekstu wszystkie znaki nieprawidłowe konwertowana do obiektów.Na przykład "<"jest zapisywana jako &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

Kwerendy wstawia tekst węzła do <Features> element:

<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> &lt;notxml&gt; as text &lt;/notxml&gt; 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 tekstu węzeł jako pierwszy element podrzędność <Root> element. Konstruktor tekstu służy do określania tekstu.

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.Wstawianie nowego elementu do kolumna bez typu danych xml

Poniższy przykład dotyczy DML XML, aby zaktualizować XML wystąpienie przechowywane w XML typ kolumna:

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

Ponownie, jeśli <Material> węzeł elementu zostanie wstawiony, wyrażenie ścieżka musi zwracać pojedynczy obiekt miejsce docelowe. Jest to jawnie określone przez dodanie [1] na końcu wyrażenie.

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

I.Wstawianie oparte na if warunek instrukcja

W poniższym przykładzie warunku IF jest określony jako część wyrażenie1 w Wstawianie Instrukcja XML DML.Jeśli warunek ma wartość PRAWDA, atrybut jest dodawany do <WorkCenter> element.

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

W poniższym przykładzie jest podobna, z tą różnicą, że Wstawianie Instrukcja XML DML wstawia element w dokumencie, jeśli warunek ma wartość true.Oznacza to jeśli <WorkCenter> element ma mniejsze niż lub równa się 2 <step> elementy podrzędność.

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

Oto wynik:

<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 kolumna xml wpisywanych węzłów

W tym przykładzie wstawia element i atrybut do instrukcji produkcji, XML przechowywane w pisma XML kolumna.

W przykładzie najpierw utworzyć tabela (T) z maszynowy XML kolumna bazy danych AdventureWorks.Następnie skopiuj wytwarzania instrukcje XML wystąpienie z instrukcji kolumna w tabela ProductModel do tabela T.Wstawienia są następnie stosowane do formatu XML w tabela 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