Sdílet prostřednictvím


vložit (XML DML)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vkládá jeden nebo více uzlů identifikovaných Expression1 jako podvozky nebo sourozence uzlu identifikovaného Expression2.

Syntaxe

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

Arguments

Výraz 1
Identifikuje jeden nebo více uzlů k vložení. Může jít o konstantní XML instanci; odkaz na zapsaný XML datový typ instance stejné kolekce XML schéma, na které je metoda úpravy aplikována; netypovaný XML datový typ instance používající samostatnou funkci sql:column()/sql:variable(); nebo výraz XQuery. Výraz může vést k jednomu uzlu, stejně jako k textovému uzlu, nebo k uspořádané posloupnosti uzlů. Nelze to vyřešit na kořenový uzel (/). Pokud výraz vede k hodnotě nebo posloupnosti hodnot, hodnoty jsou vloženy jako jeden textový uzel s mezerou mezi každou hodnotou v posloupnosti. Pokud nastavíte více uzlů jako konstantní, uzly jsou zahrnuty v závorkách a odděleny čárkami. Nelze vkládat heterogenní sekvence, jako je sekvence prvků, atributů nebo hodnot. Pokud se Expression1 vyřeší na prázdnou sekvenci, nedochází k žádné vložení a chyby nejsou vráceny.

do
Uzly identifikované Expression1 jsou vloženy jako přímí potomci (poduzly) uzlu identifikovaného Expression2. Pokud uzel v Expression2 již má jeden nebo více poduzlů, musíte použít buď jako první , nebo jako poslední , abyste určili, kam chcete nový uzel přidat. Například na začátku nebo na konci seznamu potomků. Klíčová slova jako první a poslední jsou při vkládání atributů ignorována.

after
Uzly identifikované Expression1 jsou vloženy jako sourozenci přímo za uzlem identifikovaným Expression2. Klíčové slovo po nelze použít k vložení atributů. Například jej nelze použít k vložení konstruktoru atributů ani k vrácení atributu z XQuery.

before
Uzly identifikované Expression1 jsou vloženy jako sourozenci přímo před uzelem identifikovaným Expression2. Klíčové slovo před nelze použít při vkládání atributů. Například jej nelze použít k vložení konstruktoru atributů ani k vrácení atributu z XQuery.

Výraz 2
Identifikuje uzel. Uzly identifikované v Expression1 jsou vloženy vzhledem k uzlu, který je identifikován Expression2. Může to být XQuery výraz, který vrací odkaz na uzel existující v aktuálně odkazovaném dokumentu. Pokud je vráceno více než jeden uzel, insert selže. Pokud Expression2 vrátí prázdnou sekvenci, nedochází k žádné vložení a chyby nejsou vráceny. Pokud Expression2 není staticky singleton, vrátí se statická chyba. Expression2 nemůže být instrukcí pro zpracování, komentářem ani atributem. Všimněte si, že Expression2 musí být odkazem na existující uzel v dokumentu, nikoli na konstruovaný uzel.

Examples

A. Vkládání uzlů prvků do dokumentu

Následující příklad ukazuje, jak vložit prvky do dokumentu. Nejprve je XML dokument přiřazen k proměnné typu xml . Poté příklad prostřednictvím několika insert XML DML příkazů ilustruje, jak jsou do dokumentu vloženy prvky uzlů. Po každém vložení se zobrazí výsledek příkazem SELECT.

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  

Všimněte si, že různé výrazy cest v tomto příkladu specifikují "[1]" jako požadavek na per-statické typování. To zajišťuje jeden cílový uzel.

B. Vkládání více prvků do dokumentu

V následujícím příkladu je dokument nejprve přiřazen proměnné typu xml . Poté je sekvence dvou prvků, které představují vlastnosti produktu, přiřazena druhé proměnné typu xml . Tato posloupnost se pak vloží do první proměnné.

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. Vkládání atributů do dokumentu

Následující příklad ilustruje, jak jsou atributy vloženy do dokumentu. Nejprve je dokument přiřazen k xml typové proměnné. Poté se použije série příkazů vložit XML DML k vložení atributů do dokumentu. Po každém vložení atributu zobrazí příkaz SELECT výsledek.

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. Vkládání komentářového uzlu

V tomto dotazu je XML dokument nejprve přiřazen k proměnné typu xml . Poté se XML DML používá k vložení komentářového uzlu za prvním <step> prvkem.

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. Vkládání výpočetní instrukce

V následujícím dotazu je XML dokument nejprve přiřazen k proměnné typu xml . Poté se klíčové slovo XML DML použije k vložení instrukce zpracování na začá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. Vkládání dat pomocí sekce CDATA

Když vložíte text, který obsahuje znaky, jež nejsou platné v XML, například < nebo >, můžete použít sekce CDATA k vložení dat, jak je uvedeno v následujícím dotazu. Dotaz specifikuje sekci CDATA, ale ta je přidána jako textový uzel a všechny neplatné znaky jsou převedeny na entity. Například < je uložen 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  

Dotaz vkládá do prvku <Features> textový uzel:

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

G. Vkládání textového uzlu

V tomto dotazu je XML dokument nejprve přiřazen k proměnné typu xml . Poté se XML DML používá k vložení textového uzlu jako prvního potomka prvku <Root> . Textový konstruktor se používá k určení textu.

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. Vkládání nového prvku do netypovaného sloupce xml

Následující příklad aplikuje XML DML k aktualizaci XML instance uložené ve sloupci typu xml :

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  

Opět, když <Material> je vložen uzel prvku, musí výraz cesty vrátit jeden cíl. To je explicitně specifikováno přidáním [1] na konec výrazu.

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

I. Vkládání na základě příkazu if condition

V následujícím příkladu je podmínka IF specifikována jako součást Expression1 v příkazu insert XML DML. Pokud je podmínka Pravda, přidá se k prvku <WorkCenter> atribut.

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  

Následující příklad je podobný, s tím rozdílem, že příkaz insert XML DML vkládá prvek do dokumentu, pokud je podmínka True. To znamená, že prvek <WorkCenter> má méně než nebo je rovn dvěma <step> podprvky.

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  

Toto je výsledek:

<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. Vkládání uzlů do typovaného sloupce xml

Tento příklad vkládá prvek a atribut do XML výrobních instrukcí uložených ve typovaném sloupci xml .

V příkladu nejprve vytvoříte tabulku (T) s napsaným xml sloupcem v databázi AdventureWorks. Poté zkopírujete XML instanci výrobních instrukcí ze sloupce Instrukce v tabulce ProductModel do tabulky T. Vklady jsou pak aplikovány do XML v tabulce 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             

Viz také

Porovnání typovaného XML s nezatypovaným XML
Vytvoření instancí dat XML
metody datového typu XML
Jazyk pro úpravu dat XML (XML DML)