OPENXML
Az OPENXML egy Transact-SQL kulcsszó, ami egy eredménytáblázatot képez a memóriába betöltött XML dokumentumból. Az OPENXML tulajdonképpen egy olyan eredményszolgáltató, mint amilyen a tábla, vagy a nézet (view). Ez a kulcsszó lehetővé teszi XML adatok elérését abban az esetben, ha az XML belül megfelelő relációkkal rendelkezik, és így az eredményhalmaz leképezi az XML belső felépítését. A leképezett rekordok táblában tárolhatók. Az OPENXML kulcsszót a SELECT, vagy a SELECT INTO utasításokban használhatjuk.
Ahhoz, hogy lekérdezzük az XML dokumentum tartalmát, előbb meg kell hívnunk az sp_xml_preparedocument tárolt eljárást, ami leképezi az XML-t a memóriába, és visszaad egy kezelőértéket. Ezt a leképezett tartalmat használja a szerver a feldolgozásra. Ezen az elemző folyamaton átesett dokumentum különféle csomópontok (elemek, attribútumok, szövegek, megjegyzések és egyéb elemek) fába szervezett struktúráját jelenti. A kezelőértéket megkapja az OPENXML, és a további paraméterek felhasználásával egy eredménytáblát nyújt kimenetként.

Figyelem! Ha nincs elegendő memóriánk, akkor ne elemeztessünk nagy méretű XML dokumentumokat.
Az XML belső megfeleltetését törölnünk kell, miután elvégeztük az eredményhalmaz lekérdezését. Ehhez használjuk az sp_xml_removedocument tárolt eljárást, ami felszabadítja az így lefoglalt memóriát.
Szintaxis
OPENXML(idoc int [in],rowpattern nvarchar[in],[flags byte[in]]) [WITH (SémaDeklaráció | Táblanév)]
OPENXML Paraméterek
- XML dokumentum kezelő (idoc): Az XML-t értelmező tárolt eljárás kimenete
- XPath kifejezés (sorminta), ami azonosítja a leképezni kívánt elemeket. Az XPath bármilyen XML csomópontot leképezhet (elemet, attribútumot, feldolgozási magyarázatot, stb.). Ha a sorminta egy elemcsoportot azonosít az XML-ben, akkor minden elemről egy külön sor képződik.
- A létrehozott rowset-ek leírása
- Eredményoszlopok és XML csomópontok megfeleltetése
A létrehozott rowset-ek leírása
Egy rowset sémára van szüksége az OPENXML-nek ahhoz, hogy eredményt tudjon képezni. A sémát a WITH kulcsszóval adhatjuk meg. A következők közül választhatunk a séma megadásakor:
- Megadjuk a teljes sémát a WITH kulcsszó segítségével. Ez az oszlopnevek, típusaik, és azok megfeleltetéseinek megadását jelenti.
- Megadhatunk egy meglévő táblát is, és akkor annak a sémáját használva jön létre az eredmény.
- Nem adunk meg WITH paramétert. Ebben az esetben az XML egy sajátságos tábla formátumot szolgáltat, ami tartalmazni fogja az XML teljes struktúráját. Attribútumok, csomópontok, elemek típusai. Ezen információk segítségével egy számunkra ismeretlen XML tartalomból könnyen ki tudjuk nyerni a teljes hierarchiát, majd utána ezt felhasználva analizálni tudjuk a dokumentumot.
Eredményoszlopok és XML csomópontok megfeleltetése
Az OPENXML utasításban lehetőségünk van a megfeleltetések típusát meghatározni (attribútum, vagy elem központúság). Két lehetőségünk van meghatározni ezt:
- Használjuk a flags paramétert. Ez azt feltételezi, hogy az eredményhalmaz és az XML elem neve megfeleltethető egymásnak.
- Használjuk a ColPattern paramétert. A ColPattern egy XPath kifejezés, amit a WITH paraméterben használunk, mint sémadeklarációs elemet. Ez a fajta megfeleltetés felülbírálja a flags használatát. A ColPatternt adjuk meg, ha az oszlop név különbözik a megfeleltetett elem nevétől, ebben az esetben az XML elem azonosítására szolgál.
Mindkét megfeleltetés használata opcionális, ha egyiket sem határozzuk meg, akkor az attribútum központú megfeleltetés lesz az alapértelmezett, ami a flags paraméter esetében is alapeset.
Példa
Az alábbi példában egy nagyon egyszerű OPENXML adatleképezést látunk XML dokumentumból.
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='... '
Változódeklaráció, és értékadás. A @doc változóban tároljuk az XML dokumentumot. A mellékelt állományban szerepel maga a dokumentum.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
Az XML memóriába leképezése.
SELECT *
FROM OPENXML (@idoc, '/ROOT/Vevo',1)
WITH (VevoID varchar(10),
Kapcsolattarto varchar(20))
OPENXML-t tartalmazó lekérdezés, amit 1-es flag értékkel futtatunk, és ez attribútum megfeleltetést jelent.
EXEC sp_xml_removedocument @idoc
A XML által foglalt memóriaterület felszabadítása.