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
Az OPENXML egy Transact-SQL kulcsszó, amely egy táblához vagy nézethez hasonló sorkészletet biztosít a memóriában lévő XML-dokumentumokhoz. Az OPENXML úgy teszi lehetővé az XML-adatok elérését, mintha az egy relációs sorkészlet lenne. Ezt egy XML-dokumentum belső reprezentációjának sorkészletnézetével teszi lehetővé. A sorokban lévő rekordok adatbázistáblákban tárolhatók.
Az OPENXML használható a SELECT és a SELECT INTO utasításokban, ahol a sorkészlet-szolgáltatók, a nézet vagy az OPENROWSET forrásként jelenhetnek meg. Az OPENXML szintaxisával kapcsolatos információkért lásd: OPENXML (Transact-SQL).
Ha lekérdezéseket szeretne írni egy XML-dokumentumra OPENXML használatával, először meg kell hívnia sp_xml_preparedocument. Ez elemzi az XML-dokumentumot, és visszaad egy hivatkozást az elemzett dokumentumra, amely felhasználásra kész. Az elemzett dokumentum az XML-dokumentum különböző csomópontjainak dokumentumobjektum-modellje (DOM) faképe. A dokumentum fogantyúja átadásra kerül az OPENXML-nek. Az OPENXML ezután a dokumentum sorhalmaznézetét adja meg a neki átadott paraméterek alapján.
Megjegyzés:
sp_xml_preparedocument az MSXML-elemző SQL-frissített verzióját használja, Msxmlsql.dll. Az MSXML-elemző ezen verziója úgy lett kialakítva, hogy támogassa az SQL Servert, és visszamenőlegesen kompatibilis maradjon az MSXML 2.6-os verziójával.
Az XML-dokumentumok belső ábrázolását el kell távolítani a memóriából, ha meghívja a sp_xml_removedocument rendszer által tárolt eljárást a memória felszabadításához.
Az alábbi ábrán a folyamat látható.
XML elemzése OPENXML-lel.
Vegye figyelembe, hogy az OPENXML megértéséhez ismerni kell az XPath-lekérdezéseket, és ismerni kell az XML-t. Az SQL Server XPath-támogatásával kapcsolatos további információkért lásd: XPath-lekérdezések használata az SQLXML 4.0-ban.
Megjegyzés:
Az OpenXML lehetővé teszi az XPath-minták sor- és oszlopmintáinak paraméterezését változóként. Az ilyen paraméterezés XPath-kifejezésinjektáláshoz vezethet, ha a programozó a paraméterezést külső felhasználók számára teszi elérhetővé (például ha a paramétereket egy külsőleg tárolt eljárással adják meg). Az ilyen potenciális biztonsági problémák elkerülése érdekében ajánlott, hogy az XPath-paraméterek soha ne legyenek kitéve külső hívóknak.
Example
Az alábbi példa bemutatja a OPENXML utasítás és a INSERT utasítás használatát egy SELECT utasításban. A minta XML-dokumentum <Customers> és <Orders> elemeket tartalmaz.
Először a sp_xml_preparedocument tárolt eljárás elemzi az XML-dokumentumot. Az elemzett dokumentum az XML-dokumentumban lévő csomópontok (elemek, attribútumok, szöveg és megjegyzések) faábrázolása.
OPENXML ezután erre az elemezt XML-dokumentumra hivatkozik, és sorkészlet-nézetet biztosít az XML-dokumentum egészéről vagy részeiről. Egy INSERT utasítással OPENXML adatokat szúrhat be egy ilyen sorkészletből egy adatbázistáblába. Számos OPENXML hívással megjelenítheti az XML-dokumentum különböző részeinek sorhalmaznézetét, és feldolgozhatja őket, például beszúrhatja őket különböző táblákba. Ezt a folyamatot az XML táblákba való aprításának is nevezik.
Az alábbi példában egy XML-dokumentum úgy van felosztva, hogy a <Customers> elemek a Customers táblában legyenek tárolva, az <Orders> elemek pedig a Orders táblában legyenek tárolva két INSERT utasítással. A példa egy olyan utasítást is mutat SELECT, amely OPENXML segítségével beolvassa CustomerID és OrderDate elemeket az XML-dokumentumból. A folyamat utolsó lépése a hívás sp_xml_removedocument. Ez azért történik, hogy felszabadítsa a memóriát, amely az elemzési fázisban létrehozott belső XML-fa-reprezentációt tartalmazza.
-- Create tables for later population using OPENXML.
CREATE TABLE Customers (CustomerID varchar(20) primary key,
ContactName varchar(20),
CompanyName varchar(20));
GO
CREATE TABLE Orders( CustomerID varchar(20), OrderDate datetime);
GO
DECLARE @docHandle int;
DECLARE @xmlDocument nvarchar(max); -- or xml type
SET @xmlDocument = N'<ROOT>
<Customers CustomerID="XYZAA" ContactName="Joe" CompanyName="Company1">
<Orders CustomerID="XYZAA" OrderDate="2000-08-25T00:00:00"/>
<Orders CustomerID="XYZAA" OrderDate="2000-10-03T00:00:00"/>
</Customers>
<Customers CustomerID="XYZBB" ContactName="Steve"
CompanyName="Company2">No Orders yet!
</Customers>
</ROOT>';
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument;
-- Use OPENXML to provide rowset consisting of customer data.
INSERT Customers
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/Customers')
WITH Customers;
-- Use OPENXML to provide rowset consisting of order data.
INSERT Orders
SELECT *
FROM OPENXML(@docHandle, N'//Orders')
WITH Orders;
-- Using OPENXML in a SELECT statement.
SELECT * FROM OPENXML(@docHandle, N'/ROOT/Customers/Orders')
WITH (CustomerID nchar(5) '../@CustomerID', OrderDate datetime);
-- Remove the internal representation of the XML document.
EXEC sp_xml_removedocument @docHandle;
Az alábbi ábrán a sp_xml_preparedocument használatával létrehozott korábbi XML-dokumentum elemezett XML-fája látható.
OPENXML-paraméterek
Az OPENXML paraméterei a következők:
XML-dokumentumkezelő (idoc)
XPath-kifejezés a sorokhoz leképezendő csomópontok azonosításához (rowpattern)
A létrehozandó sorhalmaz leírása
A sorhalmaz oszlopai és az XML-csomópontok közötti megfeleltetés
XML-dokumentumkezelő (idoc)
A dokumentumleírót a sp_xml_preparedocument tárolt eljárás adja vissza.
XPath-kifejezés a feldolgozandó csomópontok azonosításához (rowpattern)
A sorpatternként megadott XPath-kifejezés azonosítja az XML-dokumentumban található csomópontokat. A rowpattern által azonosított csomópontok az OPENXML által létrehozott sorhalmaz egyetlen sorának felelnek meg.
Az XPath-kifejezés által azonosított csomópontok az XML-dokumentum bármely XML-csomópontja lehetnek. Ha a rowpattern az XML-dokumentum elemeit azonosítja, minden azonosított elemcsomóponthoz egy sor tartozik a sorkészletben. Ha például a sorpattern egy attribútumban végződik, a sor minden, a sorpattern által kiválasztott attribútumcsomóponthoz létrejön.
A létrehozandó sorhalmaz leírása
Az OPENXML egy sorhalmazsémát használ az eredményként kapott sorhalmaz létrehozásához. Sorkészletséma megadásakor az alábbi beállításokat használhatja.
Az éltábla formátumának használata
A sorhalmazséma megadásához az éltábla formátumát kell használnia. Ne használja a WITH záradékot.
Ha ezt teszi, az OPENXML egy sorkészletet ad vissza éltábla formátumban. Ezt éltáblának nevezzük, mert az elemezt XML-dokumentumfa minden éle a sorhalmaz egy sorára van leképezve.
Az éltáblák egyetlen táblában jelölik a részletes XML-dokumentumstruktúrát. Ez a struktúra tartalmazza az elem- és attribútumneveket, a dokumentumhierarchiát, a névtereket és a feldolgozási utasításokat. Az éltábla formátuma lehetővé teszi, hogy olyan további információkat szerezzen be, amelyek nem válnak elérhetővé a metaproperties segítségével. További információ a metaproperties-ről: Metaproperties megadása az OPENXML-ben.
Az éltáblák által biztosított további információk lehetővé teszik egy elem és attribútum adattípusának, valamint a csomóponttípusnak a tárolását és lekérdezését, valamint az XML-dokumentum szerkezetével kapcsolatos információk tárolását és lekérdezését. Ezzel a további információval saját XML-dokumentumkezelő rendszert is létrehozhat.
Éltáblák használatával olyan tárolt eljárásokat írhat, amelyek az XML-dokumentumokat bináris nagy objektum (BLOB) bemenetként használják, létrehozva az éltáblát, majd részletesebben kinyerik és elemzik a dokumentumot. Ez a részletes szint magában foglalhatja a dokumentumhierarchiát, az elem- és attribútumneveket, a névtereket és a feldolgozási utasításokat.
Az éltábla az XML-dokumentumok tárolási formátumaként is szolgálhat, ha más relációs formátumokra való leképezés nem logikus, és egy ntext mező nem nyújt elegendő szerkezeti információt.
Olyan helyzetekben, amikor XML-elemző használatával vizsgálhat meg egy XML-dokumentumot, használhat éltáblát is, hogy ugyanazokat az információkat szerezze be.
Az alábbi táblázat a peremtábla szerkezetét ismerteti.
| Oszlop név | Adattípus | Description |
|---|---|---|
| azonosító | bigint | A dokumentumcsomópont egyedi azonosítója. A gyökérelem azonosítója 0. Az negatív azonosító értékek fenntartottak. |
| parentid | bigint | Azonosítja a csomópont szülőját. Az azonosító által azonosított szülő nem feltétlenül a szülőelem. Ez azonban annak a csomópontnak a NodeType típusától függ, amelynek szülőjét ez az azonosító azonosítja. Ha például a csomópont egy szöveges csomópont, a szülője attribútumcsomópont lehet. Ha a csomópont az XML-dokumentum legfelső szintjén található, a ParentID értéke NULL. |
| csomópont típusa | int | Azonosítja a csomóponttípust, és egy egész szám, amely megfelel az XML-objektummodell (DOM) csomóponttípus-számozásának. Az alábbi értékek jelenhetnek meg ebben az oszlopban a csomópont típusának jelzéséhez: 1 = Elemcsomópont 2 = Attribútumcsomópont 3 = Szövegcsomópont 4 = CDATA szakaszcsomópont 5 = Entitás referenciacsomópontja 6 = Entitáscsomópont 7 = Feldolgozási utasításcsomópont 8 = Megjegyzés csomópont 9 = Dokumentumcsomópont 10 = Dokumentumtípus csomópont 11 = Dokumentumtöredék csomópont 12 = Jelölési csomópont További információt a Microsoft XML (MSXML) SDK -ban található "nodeType Tulajdonság" című cikkben talál. |
| localname | nvarchar(max) | Megadja az elem vagy attribútum helyi nevét. NULL értékű, ha a DOM-objektumnak nincs neve. |
| előképző | nvarchar(max) | A csomópontnév névtérelőtagja. |
| namespaceuri | nvarchar(max) | A csomópont névterének URI-ja. Ha az érték NULL, nincs névtér. |
| Adattípus | nvarchar(max) | Az elem vagy attribútumsor tényleges adattípusa, és egyébként NULL értékű. Az adattípus a beágyazott DTD-ből vagy a beágyazott sémából származik. |
| Előző | bigint | Az előző testvérelem XML-azonosítója. Null értékű, ha nincs közvetlen korábbi testvér. |
| text | kontextus | Az attribútumértéket vagy az elemtartalmat szöveges formában tartalmazza. Vagy null értékű, ha az éltábla bejegyzésének nincs szüksége értékre. |
A WITH záradék használata egy meglévő tábla megadásához
A WITH záradék használatával megadhatja egy meglévő tábla nevét. Ehhez csak adjon meg egy meglévő táblanevet, amelynek sémáját az OPENXML használhatja a sorkészlet létrehozásához.
Séma megadása a WITH záradék használatával
A WITH záradék használatával teljes sémát adhat meg. A sorhalmazséma megadásakor meg kell adnia az oszlopneveket, az adattípusokat és az XML-dokumentumhoz való leképezésüket.
Az oszlopmintát a SchemaDeclaration ColPattern paraméterével adhatja meg. A megadott oszlopminta egy sorhalmazoszlopnak a rowpattern által azonosított XML-csomóponthoz való leképezésére szolgál, és a leképezés típusának meghatározására is szolgál.
Ha a ColPattern nincs megadva egy oszlophoz, a sorhalmaz oszlopa a jelölőparaméter által megadott leképezés alapján megfelel az XML-csomópontnak ugyanazzal a névvel. Ha azonban a ColPattern a WITH záradék sémaspecifikációjának részeként van megadva, felülírja a flags paraméterben megadott leképezést .
Az adatkészlet oszlopai és az XML-csomópontok közötti térképezés
Az OPENXML utasításban opcionálisan megadhatja a leképezés típusát( például attribútum-központú vagy elemközpontú) a sorhalmaz oszlopai és a sorpattern által azonosított XML-csomópontok között. Ezek az információk az XML-csomópontok és a sorhalmazoszlopok közötti átalakítás során használatosak.
Kétféleképpen adhatja meg a leképezést, és mindkettőt is megadhatja:
A flags paraméter használatával
A jelölőparaméter által megadott megfeleltetés feltételezi a névmegfeleltetést, amelyben az XML-csomópontok megfeleltetik az azonos nevű sorhalmazoszlopokat.
A ColPattern paraméter használatával
A ColPattern, egy XPath-kifejezés a SCHEMADeclaration részeként van megadva a WITH záradékban. A ColPatternben megadott leképezés felülírja a jelölőparaméter által megadott leképezést .
A ColPattern használatával megadhatja a leképezés típusát( például attribútum-központú vagy elemközpontú), amely felülírja vagy javítja a jelzők által jelzett alapértelmezett leképezést.
A ColPattern a következő körülmények között van megadva:
A sorhalmaz oszlopneve eltér attól az elemtől vagy attribútumnévtől, amelyhez megfeleltetik. Ebben az esetben a ColPattern azon XML-elem és attribútumnév azonosítására szolgál, amelyre a sorhalmaz oszlopa megfelel.
Egy metaproperty attribútumot szeretne hozzárendelni az oszlophoz. Ebben az esetben a ColPattern azt a metaproperanciát azonosítja, amelyhez a sorhalmaz oszlop megfelel. További információ a metaproperties használatáról: Metaproperties megadása az OPENXML-ben.
A jelzők és a ColPattern paraméterek egyaránt választhatók. Ha nincs megadva leképezés, attribútumközpontú leképezés feltételezhető. Az attribútumcentrikus leképezés a jelzőparaméter alapértelmezett értéke.
Attribútum-központú leképezés
Az OPENXML jelölőparaméterének 1 (XML_ATTRIBUTES) értékre állítása attribútumcentrikus leképezést ad meg. Ha a jelölők XML_ ATTRIBÚTUMOKAT tartalmaznak, a közzétett sorhalmaz olyan sorokat biztosít vagy használ fel, ahol minden XML-elem sorként jelenik meg. Az XML-attribútumok a SchemaDeclaration deklarációban definiált vagy a WITH záradék Táblaneve által biztosított attribútumokhoz vannak megfeleltetve a névegyezés alapján. A név-megfeleltetés azt jelenti, hogy egy adott név XML-attribútumai a sorok egy oszlopában vannak tárolva ugyanazzal a névvel.
Ha az oszlop neve eltér attól az attribútumnévtől, amelyhez hozzárendelődik, a ColPattern-t meg kell adni.
Ha az XML-attribútum névtér-minősítővel rendelkezik, a sorhalmaz oszlopnevének is rendelkeznie kell a minősítővel.
Elemközpontú leképezés
Az OPENXML jelölőparaméterének 2-esre (XML_ELEMENTS) való beállítása az elemközpontú leképezést határozza meg. Az attribútumcentrikus leképezéshez hasonló, kivéve a következő különbségeket:
A leképezési példa névegyeztetése, az azonos nevű XML-elemhez való oszlopleképezés a nem összetett alelemeket választja ki, kivéve, ha oszlopszintű minta van megadva. Ha egy alelem összetett, mivel további alelemeket tartalmaz, az oszlop NULL értéket kap. Az alelemek attribútumértékei ezután figyelmen kívül lesznek hagyva.
Több azonos nevű alelem esetén az első csomópont lesz visszaadva.