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
OPENXML je klíčové slovo Transact-SQL, které poskytuje sadu řádků nad dokumenty XML v paměti, podobně jako tabulka nebo zobrazení. OPENXML umožňuje přístup k datům XML, jako by se jedná o relační sadu řádků. To dělá tím, že poskytuje zobrazení sady řádků interní reprezentace dokumentu XML. Záznamy v sadě řádků mohou být uloženy v databázových tabulkách.
OpenXML lze použít v příkazech SELECT a SELECT INTO, kde se můžou jako zdroj objevit zprostředkovatelé sady řádků, zobrazení nebo OPENROWSET. Informace o syntaxi OPENXML naleznete v tématu OPENXML (Transact-SQL).
Chcete-li psát dotazy na dokument XML pomocí OPENXML, musíte nejprve volat sp_xml_preparedocument. Tím se dokument XML analyzuje a vrátí popisovač zpracovaného dokumentu, který je připravený k použití. Analyzovaný dokument je stromový model objektu dokumentu (DOM) znázorňuje různé uzly v dokumentu XML. Popisovač dokumentu se předá openXML. OPENXML pak poskytuje zobrazení sady řádků dokumentu na základě parametrů předaných do dokumentu.
Poznámka:
sp_xml_preparedocument používá aktualizovanou verzi analyzátoru MSXML jazyka SQL Msxmlsql.dll. Tato verze analyzátoru MSXML byla navržena tak, aby podporovala SQL Server a zůstala zpětně kompatibilní s MSXML verze 2.6.
Interní reprezentace dokumentu XML musí být odebrána z paměti použitím systémové uložené procedury sp_xml_removedocument k uvolnění paměti.
Následující obrázek znázorňuje proces.
Mějte na paměti, že abyste porozuměli jazyku OPENXML, znalost dotazů XPath a pochopení XML, je vyžadováno. Další informace o podpoře XPath v SQL Serveru naleznete v tématu Použití dotazů XPath v SQLXML 4.0.
Poznámka:
OpenXML umožňuje, aby vzory XPath řádků a sloupců byly parametrizovány jako proměnné. Tato parametrizace by mohla vést k injektážem výrazů XPath, pokud programátor zpřístupní parametrizaci externím uživatelům (například pokud jsou parametry poskytnuty externě označovanou jako uložená procedura). Aby se zabránilo takovým potenciálním problémům se zabezpečením, doporučujeme, aby parametry XPathu nikdy neměly být vystaveny externím volajícím.
Example
Následující příklad ukazuje použití OPENXML v INSERT příkazu a SELECT příkazu. Ukázkový dokument XML obsahuje <Customers> a <Orders> prvky.
Nejprve uložená procedura sp_xml_preparedocument analyzuje dokument XML. Analyzovaný dokument je stromová reprezentace uzlů (elementy, atributy, text a komentáře) v dokumentu XML.
OPENXML pak odkazuje na tento analyzovaný dokument XML a poskytuje zobrazení sady řádků všech nebo částí tohoto dokumentu XML. Příkaz INSERT , který používá OPENXML , může vložit data z takové sady řádků do databázové tabulky. Několik OPENXML volání lze použít k poskytnutí zobrazení sady řádků různých částí dokumentu XML a jejich zpracování, například vložením do různých tabulek. Tento proces se také označuje jako shredding XML do tabulek.
V následujícím příkladu je dokument XML rozdělen způsobem, tak, že prvky <Customers> jsou uloženy v tabulce Customers a prvky <Orders> jsou uloženy v tabulce Orders pomocí dvou příkazů INSERT. Příklad také ukazuje příkaz SELECT, který OPENXML načte CustomerID a OrderDate z dokumentu XML. Posledním krokem v procesu je volání sp_xml_removedocument. To se provádí, aby se uvolnila paměť přidělená tak, aby obsahovala interní reprezentaci stromu XML, která byla vytvořena během fáze analýzy.
-- 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;
Následující obrázek znázorňuje analyzovaný strom XML předchozího dokumentu XML, který byl vytvořen pomocí sp_xml_preparedocument.
Parametry OPENXML
Parametry OPENXML zahrnují následující:
Popisovač dokumentu XML (idoc)
Výraz XPath k identifikaci uzlů, které se mají namapovat na řádky (rowpattern)
Popis sady řádků, která se má vygenerovat
Mapování mezi sloupci sady řádků a uzly XML
Handle dokumentu XML (idoc)
Popisovač dokumentu je vrácen uloženou procedurou sp_xml_preparedocument.
Výraz XPath k identifikaci uzlů, které se mají zpracovat (rowpattern)
Výraz XPath zadaný jako rowpattern identifikuje sadu uzlů v dokumentu XML. Každý uzel identifikovaný pomocí rowpattern odpovídá jednomu řádku v sadě řádků vygenerované jazykem OPENXML.
Uzly identifikované výrazem XPath mohou být libovolným uzlem XML v dokumentu XML. Pokud rowpattern identifikuje sadu prvků v dokumentu XML, existuje jeden řádek v sadě řádků pro každý uzel elementu identifikovaný. Pokud například rowpattern končí v atributu, vytvoří se řádek pro každý uzel atributu vybraný pomocí rowpattern.
Popis sady řádků, která se má vygenerovat
OpenXML používá schéma sady řádků k vygenerování výsledné sady řádků. Při zadávání schématu sady řádků můžete použít následující možnosti.
Použití formátu hraniční tabulky
K určení schématu sady řádků byste měli použít formát tabulky edge. Nepoužívejte klauzuli WITH.
Když to uděláte, OPENXML vrátí sadu řádků ve formátu tabulky edge. Tato tabulka se označuje jako tabulka hran, protože každá hrana v analyzované stromové struktuře dokumentu XML se mapuje na řádek v řádkové sadě.
Hraniční tabulky představují v jedné tabulce jemně odstupňovanou strukturu dokumentu XML. Tato struktura zahrnuje názvy elementů a atributů, hierarchii dokumentů, obory názvů a pokyny ke zpracování. Formát hraniční tabulky umožňuje získat další informace, které nejsou přístupné prostřednictvím metapropertů. Další informace o metaproperties naleznete v tématu Určení metaproperties v OPENXML.
Další informace poskytované hraniční tabulkou umožňují ukládat a dotazovat datový typ elementu a atributu a typu uzlu a také ukládat a dotazovat informace o struktuře dokumentu XML. Pomocí těchto dalších informací může být také možné vytvořit vlastní systém správy dokumentů XML.
Pomocí hraniční tabulky můžete napsat uložené procedury, které přebírají dokumenty XML jako vstup binárního velkého objektu (BLOB), vytvoří hraniční tabulku a pak extrahují a analyzují dokument na podrobnější úrovni. Tato podrobná úroveň může zahrnovat vyhledání hierarchie dokumentů, názvy prvků a atributů, obory názvů a pokyny ke zpracování.
Hraniční tabulka může také sloužit jako formát úložiště pro dokumenty XML, pokud mapování na jiné relační formáty není logické a pole ntext neposkytuje dostatek strukturálních informací.
V situacích, kdy můžete použít analyzátor XML k prozkoumání dokumentu XML, můžete místo toho použít hraniční tabulku k získání stejných informací.
Následující tabulka popisuje strukturu hraniční tabulky.
| Název sloupce | Datový typ | Description |
|---|---|---|
| id | bigint | Je jedinečné ID uzlu dokumentu. Kořenový prvek má hodnotu ID 0. Záporné hodnoty ID jsou rezervované. |
| parentid | bigint | Identifikuje rodiče uzlu. Nadřazený objekt identifikovaný tímto ID nemusí nutně být nadřazeným prvkem. To však závisí na typu uzlu (NodeType) rodičovského uzlu, který je identifikován tímto ID. Pokud je například uzel textovým uzlem, jeho nadřazeným uzlem může být uzel atributu. Pokud je uzel na nejvyšší úrovni v dokumentu XML, jeho ParentID je NULL. |
| typ uzlu | int | Identifikuje typ uzlu a je celé číslo odpovídající číslování typu uzlu modelu DOM (XML Object Model). Následují hodnoty, které se můžou zobrazit v tomto sloupci, které označují typ uzlu: 1 = uzel elementu 2 = uzel atributu 3 = Textový uzel 4 = uzel oddílu CDATA 5 = Referenční uzel entity 6 = uzel entita 7 = Uzl zpracování pokynů 8 = uzel komentáře 9 = uzel dokumentu 10 = uzel Typu dokumentu 11 = uzel fragmentu dokumentu 12 = notace uzel Další informace najdete v článku "nodeType Property" v sadě Microsoft XML (MSXML) SDK. |
| localname | nvarchar(max) | Poskytuje místní název elementu nebo atributu. Má hodnotu NULL, pokud objekt DOM nemá název. |
| předpona | nvarchar(max) | Jedná se o předponu oboru názvů pro název uzlu. |
| namespaceuri | nvarchar(max) | Je identifikátor URI oboru názvů uzlu. Pokud je hodnota NULL, neexistuje žádný obor názvů. |
| Datatype | nvarchar(max) | Je skutečný datový typ řádku elementu nebo atributu a je jinak NULL. Datový typ je odvozen z vloženého DTD nebo z vloženého schématu. |
| Předchozí | bigint | Je ID XML předchozího sousedního prvku. Je NULL, pokud neexistuje žádný přímý předcházející sourozenec. |
| text | ntext | Obsahuje hodnotu atributu nebo obsah prvku v textovém formuláři. Pokud položka hraniční tabulky nepotřebuje hodnotu, má hodnotu NULL. |
Použití klauzule WITH k určení existující tabulky
Pomocí klauzule WITH můžete zadat název existující tabulky. Uděláte to tak, že zadáte existující název tabulky, jehož schéma může openXML použít k vygenerování sady řádků.
Použití klauzule WITH k určení schématu
Pomocí klauzule WITH můžete zadat úplné schéma. Při zadávání schématu sady řádků zadáte názvy sloupců, jejich datové typy a jejich mapování na dokument XML.
Vzor sloupce můžete zadat pomocí parametru ColPattern v schemaDeclaration. Zadaný vzor sloupce se používá k mapování sloupce sady řádků na uzel XML identifikovaný pomocí rowpattern a slouží také k určení typu mapování.
Pokud není pro sloupec uveden ColPattern, sloupec sady řádků se mapuje na uzel XML se stejným názvem na základě mapování určeného parametrem flags. Pokud je však ColPattern zadán jako součást specifikace schématu v klauzuli WITH, přepíše mapování zadané v parametru flags .
Mapování mezi sloupci sady řádků a uzly XML
V příkazu OPENXML můžete volitelně zadat druh mapování, například orientovaný na atributy nebo orientovaný na elementy, mezi sloupce výsledkové sady a uzly XML, které jsou identifikovány rowpattern. Tyto informace se používají při transformaci mezi uzly XML a sloupci řádků.
Mapování můžete zadat dvěma způsoby a můžete také zadat obojí:
Pomocí parametru flags
Mapování, které je určeno parametrem flags, předpokládá odpovídající názvy, ve kterých uzly XML odpovídají sloupcům sady řádků se stejnými názvy.
Pomocí parametru ColPattern
ColPattern, výraz XPath, je určen jako součást SchemaDeclaration v klauzuli WITH. Mapování zadané v ColPattern přepíše mapování určené parametrem flags .
ColPattern lze použít k určení typu mapování, například orientovaného na atribut nebo na prvek, které přepíše nebo vylepší výchozí mapování označené příznaky.
ColPattern je specifikován za následujících okolností:
Název sloupce v sadě řádků se liší od názvu elementu nebo atributu, na který se mapuje. V tomto případě se ColPattern používá k identifikaci elementu XML a názvu atributu, na který se sloupec sady řádků mapuje.
Chcete namapovat atribut metaproperty na sloupec. V tomto případě se ColPattern používá k identifikaci meta vlastnosti, na kterou je mapován sloupec řádkové sady. Další informace o použití metaproperties naleznete v tématu Určení metaproperties v OPENXML.
Příznaky i parametry ColPattern jsou volitelné. Pokud není zadáno žádné mapování, předpokládá se mapování zaměřené na atributy. Mapování zaměřené na atributy je výchozí hodnota parametru flags .
Mapování zaměřené na atributy
Nastavení parametru příznaků v OPENXML na 1 (XML_ATTRIBUTES) určuje mapování zaměřené na atributy . Pokud příznaky obsahují XML_ ATRIBUTY, sada vystavených řádků poskytuje nebo spotřebovává řádky, ve kterých je každý element XML reprezentován jako řádek. Atributy XML jsou mapovány na atributy, které jsou definovány ve SchemaDeclaration, nebo na ty, které jsou poskytovány klauzulí WITH TableName, na základě shody názvů. Korespondence názvů znamená, že atributy XML konkrétního názvu jsou uloženy ve sloupci v sadě řádků se stejným názvem.
Pokud se název sloupce liší od názvu atributu, na který se mapuje, musí být zadán ColPattern.
Pokud má atribut XML předponu oboru názvů, musí mít název sloupce v sadě řádků také tuto předponu.
Mapování zaměřené na elementy
Nastavení parametru příznaků v OPENXML na 2 (XML_ELEMENTS) určuje mapování zaměřené na elementy . Podobá se mapování zaměřenému na atributy s výjimkou následujících rozdílů:
V korespondenci názvů příkladu mapování zvolí sloupec, který se mapuje na XML element se stejným názvem, nekomplexní subelementy, pokud není specifikován vzor na úrovni sloupce. V procesu načítání, pokud je dílčí prvek složitý kvůli tomu, že obsahuje další dílčí prvky, je sloupec nastaven na hodnotu NULL. Hodnoty atributů dílčích částí se pak ignorují.
Pro více dílčích elementů, které mají stejný název, se vrátí první uzel.
Viz také
- sp_xml_preparedocument (Transact-SQL)
- sp_xml_removedocument (Transact-SQL)
- OPENXML (Transact-SQL)
- dat XML (SQL Server)