Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
Egy vagy több csomópontot helyez be, amelyeket az Expression1 azonosít gyermekcsomópontként vagy testvérként azonosítva, amelyet az Expression2 azonosít.
Szemantika
insert Expression1 (
{as first | as last} into | after | before
Expression2
)
Arguments
Kifejezés1
Azonosít egy vagy több csomópontot, amit be kell illeszteni. Ez lehet egy állandó XML példány; hivatkozás egy gépelt XML adattípus példányra ugyanannak az XML sémagyűjteménynek, amelyen a módosítási módszert alkalmazzák; egy típus nélküli XML adattípus példány, amely önálló sql:column()/sql:variable() függvényt használ; vagy egy XQuery kifejezést. Az kifejezés eredményezhet csomópontot, szövegcsomópontot is, vagy egy rendezett csomópontsorozatot. Nem tudja a gyökércsomópontra (/) feloldani. Ha az kifejezés értéket vagy értéksorozatot eredményez, az értékek egyetlen szövegcsomópontként kerülnek be, ahol egy teres választja el az egyes értékeket a sorozatban. Ha több csomópontot állandónak adsz meg, a csomópontok zárójelben vannak, és vesszőkkel vannak elválasztva. Nem lehet heterogén szekvenciákat beilleszteni, például elemek, attribútumok vagy értékek sorozatát. Ha az 1-es kifejezés üres sorozatra oldódik, nem történik beszúrás és hibák nem érkeznek.
ba
Az 1-es kifejezéssel azonosított csomópontokat közvetlenül a 2-es kifejezéssel azonosított csomópont leszármazottaiként (gyermekcsomópontokként) helyezik be. Ha az Expression2 csomópontjának már van egy vagy több gyermekcsomópontja, akkor először vagyutolsóként kell megadnod, hogy hol szeretnéd hozzáadni az új csomópontot. Például a gyermeklista elején vagy végén sorrendben. Az első és utolsó kulcsszavakat figyelmen kívül hagyják, amikor attribútumokat illesztenek be.
after
Az Expression1 által azonosított csomópontokat testvérként helyezik be közvetlenül a 2 által azonosított csomópont után. Az after kulcsszó nem használható attribútumok beillesztésére. Például nem használható attribútumkonstruktor beszúrására vagy egy XQuery-ből származó attribútumhoz való visszaadáshoz.
before
Az Expression1 által azonosított csomópontokat testvérként helyezik be közvetlenül az Expression2 által azonosított csomópont előtt. Az előző kulcsszó nem használható, amikor attribútumokat illesztenek be. Például nem használható attribútumkonstruktor beszúrására vagy egy XQuery-ből származó attribútumhoz való visszaadáshoz.
Kifejezés2
Azonosít egy csomópontot.
Az Expression1-ben azonosított csomópontok a Expression2 által azonosított csomóponthoz viszonyítva vannak behelyezve. Ez lehet egy XQuery kifejezés, amely visszaadja a hivatkozást egy pontra vonatkozóan, amely a jelenleg hivatkozott dokumentumban létezik. Ha több csomópontot is visszaadnak, a betétek meghibásodik. Ha a 2-es kifejezés üres sorozatot ad vissza, nem történik beillesztés és hibák sem érkeznek. Ha a 2-es kifejezés statikus módon nem egy-egy egyetlen, statikus hiba jelenik meg.
A 2-es kifejezés nem lehet feldolgozó utasítás, megjegyzés vagy attribútum. Fontos megjegyezni, hogy a 2-es kifejezésnek egy meglévő csomópontra kell utalnia a dokumentumban, nem pedig egy konstruált csomópontra.
Példák
A. Elemcsomópontok behelyezése a dokumentumba
A következő példa bemutatja, hogyan lehet elemeket beilleszteni egy dokumentumba. Először egy XML dokumentumot egy xml típusú változóhoz rendelnek. Ezután több XML DML utasítás beszekedésével a példa bemutatja, hogyan helyezik be az elemcsomópontok a dokumentumba. Minden beszúrás után a SELECT utasítás megjeleníti az eredményt.
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
Fontos megjegyezni, hogy ebben a példában szereplő különböző útkifejezések "[1]" statikus típuszási követelményként megadják a "[1]"-et. Ez biztosítja az egyetlen célpont csomópontot.
B. Több elem behelyezése a dokumentumba
A következő példában először egy dokumentumot egy xml típusú változóhoz rendelünk. Ezután egy két, szorzatjellemzőket képviselő két elemből álló sorozatot rendelnek egy második, xml típusú változóhoz. Ezt a sorozatot beillesztjük az első változóba.
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. Attribútumok behelyezése egy dokumentumba
A következő példa szemlélteti, hogyan helyezik be az attribútumokat egy dokumentumba. Először egy dokumentumot egy xml típusú változóhoz rendelnek. Ezután egy sor XML DML utasítást használnak attribútumok beillesztésére a dokumentumba. Minden attribútum-behelyezés után a SELECT utasítás megjeleníti az eredményt.
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. Kommentcsomópont behelyezése
Ebben a lekérdezésben először egy XML dokumentumot rendelnek egy xml típusú változóhoz. Ezután XML DML-t használnak egy kommentcsomópont hozzáadására az első <step> elem után.
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. Feldolgozási utasítás behelyezése
A következő lekérdezésben először egy XML dokumentumot rendelnek egy xml típusú változóhoz. Ezután az XML DML kulcsszavat használják egy feldolgozási utasítás beillesztésére a dokumentum elejére.
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. Adatbeültetés CDATA szekcióval
Ha olyan szöveget adsz be, amelyek XML-ben nem érvényesek karaktereket tartalmaznak, például < vagy >, a CDATA szekciókkal adhatod be az adatokat, ahogy az alábbi lekérdezésben látható. A lekérdezés CDATA szakaszt ad meg, de szövegcsomópontként adják hozzá, ahol minden érvénytelen karaktert entitássá alakítanak. Például <<.
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
A lekérdezés szöveges csomópontot helyez be az <Features> elembe:
<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features> <notxml@gt; as text </notxml> or cdata </Features>
</ProductDescription>
</Root>
G. Szövegcsomópont behelyezése
Ebben a lekérdezésben először egy XML dokumentumot rendelnek egy xml típusú változóhoz. Ezután XML DML-t használnak egy szövegcsomópont beillesztésére, mint az <Root> elem első gyermeke. A szövegkonstruktor a szöveg megadásához szolgál.
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. Új elem behelyezése egy típus nélküli xml oszlopba
A következő példa XML DML-t alkalmaz egy xml típusú oszlopban tárolt XML példány frissítésére:
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
Ismét, amikor az <Material> elemcsomópontot beillesztjük, az útkifejezésnek egyetlen célpontot kell visszaadnia. Ezt kifejezetten úgy határozzák meg, hogy a kifejezés végére egy [1] jelet adunk.
-- check the update
SELECT x.query(' //ProductDescription/Features')
FROM T;
GO
I. If feltétel szerinti beillesztés
A következő példában egy IF feltétel van megadva az 1-es kifejezés részeként az XML DML utasítás beépítésében . Ha a feltétel igaz, akkor egy attribútumot adunk hozzá az <WorkCenter> elemhez.
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
A következő példa hasonló, kivéve, hogy az insert XML DML utasítás elemet helyez be a dokumentumba, ha a feltétel igaz. Azaz, ha az <WorkCenter> elem kevesebb, mint vagy egyenlő két <step> gyermekelemmel.
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
Ez az eredmény:
<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. Csomópontok behelyezése egy típusozott xml oszlopba
Ez a példa egy elemet és egy attribútumot helyez be egy gyártási utasításba (XML), amelyet egy gépelt xml oszlopban tárolnak.
A példában először létrehozol egy táblát (T) egy gépelt xml oszloppal az AdventureWorks adatbázisban. Ezután egy gyártási utasítás XML példányt másolsz a ProductModel tábla Instructions oszlopából a T táblába. Ezután a beillesztéseket XML-re alkalmazzák a T táblában.
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
Lásd még:
Típusos XML összehasonlítása a típus nélküli XML-lel
XML-adatpéldányok létrehozása
xml-adattípus-metódusok
XML-adatmódosítási nyelv (XML DML)