infoga (XML DML)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Sätter in en eller flera noder som identifierats av Expression1 som barnnoder eller syskon till den nod som identifierats av Expression2.

Syntax

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

Arguments

Uttryck1
Identifierar en eller flera noder att infoga. Detta kan vara en konstant XML-instans; en referens till en typad XML-datatypinstans av samma XML Schema-samling som modifieringsmetoden tillämpas på; en otypad XML-datatypinstans som använder en fristående sql:column()/sql:variable() -funktion; eller ett XQuery-uttryck. Uttrycket kan resultera i en nod, och även en textnod, eller i en ordnad sekvens av noder. Den kan inte lösa sig till rotnoden (/). Om uttrycket resulterar i ett värde eller en sekvens av värden, infogas värdena som en enda textnod med ett mellanslag mellan varje värde i sekvensen. Om du anger flera noder som konstanta inkluderas noderna inom parentes och separeras av kommatecken. Du kan inte infoga heterogena sekvenser såsom en sekvens av element, attribut eller värden. Om Expression1 löses till en tom sekvens sker ingen insättning och inga fel returneras.

in
Noder identifierade av Expression1 infogas som direkta efterföljare (barnnoder) till den nod som identifierats av Expression2. Om noden i Expression2 redan har en eller flera barnnoder måste du använda antingen som först eller sist för att ange var du vill ha den nya noden tillagd. Till exempel i början eller slutet av barnlistan, respektive. Nyckelorden som först, och som som sist, ignoreras när attribut infogas.

after
Noder identifierade av Expression1 infogas som syskon direkt efter den nod som identifierats av Expression2. Efter-nyckelordet kan inte användas för att infoga attribut. Till exempel kan den inte användas för att infoga en attributkonstruktör eller för att returnera ett attribut från en XQuery.

before
Noder som identifieras av Expression1 infogas som syskon direkt före den nod som identifierats av Expression2. Före-nyckelordet kan inte användas när attribut infogas. Till exempel kan den inte användas för att infoga en attributkonstruktör eller för att returnera ett attribut från en XQuery.

Uttryck 2
Identifierar en nod. Noderna som identifieras i Expression1 infogas relativt den nod som identifieras av Expression2. Detta kan vara ett XQuery-uttryck som returnerar en referens till en nod som finns i det aktuella dokumentet. Om mer än en nod returneras misslyckas insättningen. Om Expression2 returnerar en tom sekvens sker ingen insättning och inga fel returneras. Om Expression2 statiskt sett inte är en singel, returneras ett statiskt fel. Expression2 kan inte vara en bearbetningsinstruktion, kommentar eller attribut. Observera att Expression2 måste vara en referens till en befintlig nod i dokumentet och inte en konstruerad nod.

Examples

A. Insättning av elementnoder i dokumentet

Följande exempel illustrerar hur man infogar element i ett dokument. Först tilldelas ett XML-dokument en variabel av xml-typ . Sedan, genom flera insättningar av XML DML-satser, illustrerar exemplet hur elementnoder infogas i dokumentet. Efter varje insättning visar SELECT-satsen resultatet.

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

Observera att olika väguttryck i detta exempel specificerar "[1]" som ett krav på typning per statisk. Detta säkerställer en enda målnod.

B. Insättning av flera element i dokumentet

I följande exempel tilldelas ett dokument först en variabel av xml-typ . Därefter tilldelas en sekvens av två element, som representerar produktfunktioner, till en andra variabel av xml-typ . Denna sekvens infogas sedan i den första variabeln.

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. Infoga attribut i ett dokument

Följande exempel illustrerar hur attribut infogas i ett dokument. Först tilldelas ett dokument en xml-typvariabel . Därefter används en serie insert-XML DML-satser för att infoga attribut i dokumentet. Efter varje attributinsättning visar SELECT-satsen resultatet.

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. Insättning av en kommentarsnod

I denna fråga tilldelas först ett XML-dokument till en variabel av xml-typ . Därefter används XML DML för att infoga en kommentarnod efter det första <step> elementet.

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. Insättning av en bearbetningsinstruktion

I följande fråga tilldelas först ett XML-dokument till en variabel av xml-typ . Därefter används XML DML-nyckelordet för att infoga en bearbetningsinstruktion i början av dokumentet.

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. Infoga data med hjälp av en CDATA-sektion

När du infogar text som innehåller tecken som inte är giltiga i XML, såsom < eller >, kan du använda CDATA-sektioner för att infoga datan som visas i följande fråga. Frågan specificerar en CDATA-sektion, men den läggs till som en textnod där eventuella ogiltiga tecken konverteras till entiteter. Till exempel sparas < som &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  

Frågan infogar en textnod i elementet <Features> :

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

G. Insättning av textnod

I denna fråga tilldelas först ett XML-dokument till en variabel av xml-typ . Därefter används XML DML för att infoga en textnod som elementets <Root> första barn. Textkonstruktorn används för att specificera texten.

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. Insättning av ett nytt element i en otypad xml-kolumn

Följande exempel tillämpar XML DML för att uppdatera en XML-instans som lagras i en xml-typkolumn :

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>Aluminum</Material> as first  
  into   (/Root/ProductDescription/Features)[1]  
');  
GO  

Återigen, när <Material> elementnoden infogas måste väguttrycket returnera ett enda mål. Detta specificeras explicit genom att lägga till en [1] i slutet av uttrycket.

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

I. Infoga baserat på en if-villkor sats

I följande exempel specificeras ett IF-villkor som en del av Expression1 i insert-XML DML-satsen. Om villkoret är True läggs ett attribut till elementet <WorkCenter> .

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  

Följande exempel är liknande, förutom att insert XML DML-satsen infogar ett element i dokumentet om villkoret är True. Det vill säga, om elementet <WorkCenter> har mindre än eller är lika med två <step> barnelement.

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  

Det här är resultatet:

<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. Insättning av noder i en typad xml-kolumn

Detta exempel infogar ett element och ett attribut i en tillverkningsinstruktions-XML som lagras i en typad xml-kolumn .

I exemplet skapar du först en tabell (T) med en typad xml-kolumn i AdventureWorks-databasen. Du kopierar sedan en tillverkningsinstruktions-XML-instans från kolumnen Instruktioner i ProductModel-tabellen till tabell T. Insättningar appliceras sedan på XML i tabell 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             

Se även

Jämför typad XML med otypad XML
Skapa instanser av XML-data
xml-datatypsmetoder
XML-datamodifieringsspråk (XML DML)