Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL 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 .<
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> <notxml@gt; as text </notxml> 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)