insert (XML DML)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Fügt einen oder mehrere Knoten ein, die durch Expression1 als unter- oder gleichgeordnete Knoten des Knotens identifiziert werden, der durch Expression2 angegeben wird.

Syntax

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

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

Expression1
Gibt einen oder mehrere einzufügende Knoten an. Dabei kann es sich um eine konstante XML-Instanz, einen Verweis auf eine typisierte XML-Datentypinstanz der gleichen XML-Schemaauflistung, auf der die modify-Methode angewendet wird, eine nicht typisierte XML-Datentypinstanz mit einer eigenständigen sql:column()/sql:variable() -Funktion oder einen XQuery-Ausdruck handeln. Der Ausdruck kann als Ergebnis einen Knoten, einen Textknoten oder eine geordnete Sequenz von Knoten haben. Der Ausdruck kann nicht den Stammknoten (/) auflösen. Wenn das Ergebnis des Ausdrucks ein Wert oder eine Sequenz von Werten ist, werden diese Werte als einzelner Textknoten eingefügt, wobei ein Leerzeichen die einzelnen Werte in der Sequenz trennt. Wenn Sie mehrere Knoten als Konstante angeben, werden die Knoten in Klammern eingeschlossen und durch Kommas getrennt. Sie können keine heterogenen Sequenzen wie z. B. eine Sequenz aus Elementen, Attributen oder Werten einfügen. Wenn Expression1 in eine leere Sequenz aufgelöst wird, findet kein Einfügevorgang statt, und es werden keine Fehler zurückgegeben.

into
Knoten, die durch Expression1 angegeben werden, werden als direkte Nachfolger (untergeordnete Knoten) des Knotens eingefügt, der durch Expression2 angegeben wird. Wenn der Knoten in Expression2 bereits über einen oder mehrere untergeordnete Knoten verfügt, müssen Sie as first oder as last verwenden, wenn Sie angeben möchten, wo der neue Knoten hinzugefügt werden soll. Beispielsweise am Anfang bzw. Ende der Liste der untergeordneten Knoten. Die as first- und as last-Schlüsselwörter werden ignoriert, wenn Attribute eingefügt werden.

after
Knoten, die durch Expression1 angegeben werden, werden als gleichgeordnete Knoten direkt hinter dem Knoten eingefügt, der durch Expression2 angegeben wird. Das after-Schlüsselwort kann nicht zum Einfügen von Attributen verwendet werden. Es kann z. B. nicht zum Einfügen eines Attributkonstruktors oder zum Zurückgeben eines Attributs aus einer XQuery verwendet werden.

before
Knoten, die durch Expression1 angegeben werden, werden als gleichgeordnete Knoten direkt vor dem Knoten eingefügt, der durch Expression2 angegeben wird. Das before-Schlüsselwort kann nicht verwendet werden, wenn Attribute eingefügt werden. Es kann z. B. nicht zum Einfügen eines Attributkonstruktors oder zum Zurückgeben eines Attributs aus einer XQuery verwendet werden.

Expression2
Identifiziert einen Knoten. Die in Expression1 identifizierten Knoten werden relativ zu dem Knoten eingefügt, der durch Expression2 angegeben wird. Dabei kann es sich um einen XQuery-Ausdruck handeln, der einen Verweis auf einen Knoten zurückgibt, der in dem Dokument vorhanden ist, auf das aktuell verwiesen wird. Wenn mehrere Knoten zurückgegeben werden, schlägt der Einfügevorgang fehl. Wenn Expression2 eine leere Sequenz zurückgibt, findet kein Einfügevorgang statt, und es werden keine Fehler zurückgegeben. Wenn Expression2 keine statische SINGLETON-Instanz darstellt, wird ein statischer Fehler zurückgegeben. Expression2 darf weder eine Verarbeitungsanweisung noch ein Kommentar oder ein Attribut sein. Beachten Sie, dass Expression2 ein Verweis auf einen vorhandenen Knoten im Dokument, nicht auf einen erstellten Knoten, sein muss.

Beispiele

A. Einfügen von Elementknoten in das Dokument

Das folgende Beispiel veranschaulicht das Einfügen von Elementen in ein Dokument. Zuerst wird ein XML-Dokument einer Variablen des Typs xml zugewiesen. Das Beispiel zeigt anschließend durch mehrere XML DML insert-Anweisungen, wie Elementknoten in das Dokument eingefügt werden. Nach jedem Einfügevorgang zeigt die SELECT-Anweisung das Ergebnis an.

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  

Beachten Sie, dass verschiedene path-Ausdrücke in diesem Beispiel "[1]" als Anforderung für die statische Typisierung angeben. Auf diese Weise wird ein einzelner Zielknoten gewährleistet.

B. Einfügen von mehreren Elementen in das Dokument

Im folgenden Beispiel wird ein Dokument zuerst einer Variablen des Typs xml zugewiesen. Anschließend wird eine Sequenz aus zwei Elementen, die Produktfeatures darstellen, einer zweiten Variablen des Typs xml zugewiesen. Diese Sequenz wird dann in die erste Variable eingefügt.

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. Einfügen von Attributen in ein Dokument

Das folgende Beispiel veranschaulicht das Einfügen von Attributen in ein Dokument. Zuerst wird ein Dokument einer Variablen des Typs xml zugewiesen. Anschließend wird eine Reihe von XML-DML-insert-Anweisungen verwendet, um Attribute in das Dokument einzufügen. Nach jeder Attributeinfügung zeigt die SELECT-Anweisung das Ergebnis an.

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: Einfügen eines Kommentarknotens

In dieser Abfrage wird ein XML-Dokument zuerst einer Variablen des Typs xml zugewiesen. Anschließend wird XML DML zum Einfügen eines Kommentarknotens nach dem ersten <step>-Element verwendet.

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. Einfügen einer Verarbeitungsanweisung

In der folgenden Abfrage wird ein XML-Dokument zuerst einer Variablen des Typs xml zugewiesen. Anschließend wird ein XML DML-Schlüsselwort verwendet, um eine Verarbeitungsanweisung am Anfang des Dokuments einzufügen.

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. Einfügen von Daten mit einem CDATA-Abschnitt

Wenn Sie Text mit Zeichen einfügen, die in XML nicht verwendet werden können, z. B. < oder >, können Sie die Daten wie in der folgenden Abfrage veranschaulicht mithilfe von CDATA-Abschnitten einfügen. Die Abfrage gibt einen CDATA-Abschnitt an, wird jedoch als Textknoten hinzugefügt, wobei alle ungültigen Zeichen in Entitäten konvertiert werden. < wird beispielsweise als &lt; gespeichert.

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  

Die Abfrage fügt einen Textknoten in das Element <Features> ein:

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

G. Einfügen von Textknoten

In dieser Abfrage wird ein XML-Dokument zuerst einer Variablen des Typs xml zugewiesen. Im Anschluss wird mit XML DML ein Textknoten als erstes untergeordnetes Element von <Root> eingefügt. Der Textkonstruktor wird zum Angeben des Texts verwendet.

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. Einfügen eines neuen Elements in eine nicht typisierte XML-Spalte

Das folgende Beispiel verwendet XML DML zum Aktualisieren einer XML-Instanz, die in einer Spalte vom Typ xml gespeichert ist:

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  

Auch hier gilt: Wenn der Elementknoten <Material> eingefügt wird, muss vom Pfadausdruck ein einzelnes Ziel zurückgegeben werden. Dies wird explizit durch Hinzufügen des Werts [1] am Ende des Ausdrucks angegeben.

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

I. Einfügen anhand einer Bedingungsanweisung

Im folgenden Beispiel wird eine IF-Bedingung als Teil von Expression1 in der XML-DML-insert-Anweisung angegeben. Wenn die Bedingung erfüllt ist, wird dem Element <WorkCenter> ein Attribut hinzugefügt.

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  

Das folgende Beispiel ist ähnlich, die XML-DML-insert-Anweisung fügt jedoch ein Element in das Dokument ein, wenn die Bedingung den Wert True besitzt. Dies ist der Fall, wenn das Element <WorkCenter> nicht mehr als zwei untergeordnete <step>-Elemente enthält.

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  

Dies ist das Ergebnis:

<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. Einfügen von Knoten in einer typisierten XML-Spalte

Das folgende Beispiel fügt ein Element und ein Attribut in das XML-Dokument mit den Fertigungsanweisungen ein, das in einer typisierten xml-Spalte gespeichert ist.

In diesem Beispiel erstellen Sie zuerst eine Tabelle (T) mit einer typisierten xml-Spalte in der AdventureWorks-Datenbank. Anschließend kopieren Sie eine XML-Instanz mit Fertigungsanweisungen aus der Instructions-Spalte in der ProductModel-Tabelle in Tabelle T. Die Einfügungen werden dann am XML in Tabelle T vorgenommen.

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             

Weitere Informationen

Vergleichen von typisiertem XML mit nicht typisiertem XML
Erstellen von Instanzen der XML-Daten
xml Data Type Methods (xml-Datentypmethoden)
XML DML (Data Modification Language)