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 poskytuje pohled na řádky nad XML dokumentem. Protože OPENXML je poskytovatelem řádků, lze jej použít v Transact-SQL příkazech, OPENXML ve kterých se mohou objevit poskytovatelé řádků, jako jsou tabulka, pohled nebo OPENROWSET funkce.
Syntaxe
OPENXML ( idoc int [ in ]
, rowpattern nvarchar [ in ]
, [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]
Arguments
IDoC
Dokumentová ovládka interní reprezentace XML dokumentu. Vnitřní reprezentace XML dokumentu se vytváří voláním sp_xml_preparedocument.
Řádkový vzor
Vzor XPath používaný k identifikaci uzlů, které mají být zpracovány jako řádky. Uzly pocházejí z XML dokumentu, jehož handle je předáván v parametru idoc .
flags
Ukazuje mapování použité mezi XML daty a relační sadou řádků a jak je sloupec přelévání vyplněn. Příznaky jsou volitelný vstupní parametr a mohou mít jednu z následujících hodnot.
| Hodnota bajtu | Description |
|---|---|
0 |
Výchozí nastavení je mapování attribute-centric . |
1 |
Použijte attribute-centric mapování. Lze kombinovat s XML_ELEMENTS. V tomto případě attribute-centric se nejprve aplikuje mapování. Dále element-centric se aplikuje mapování pro všechny zbývající sloupce. |
2 |
Použijte element-centric mapování. Lze kombinovat s XML_ATTRIBUTES. V tomto případě element-centric se nejprve aplikuje mapování. Dále attribute-centric se aplikuje mapování pro všechny zbývající sloupce. |
8 |
Lze ji (logickým OR) kombinovat s XML_ATTRIBUTES nebo XML_ELEMENTS. V kontextu vyhledávání tento příznak znamená, že spotřebovaná data by neměla být kopírována do vlastnosti @mp:xmltextpřetečení. |
SchemaDeclaration
Definice schématu formy: ColNameColType [ ColPattern | MetaProperty ] [ , ColNameColType [ ColPattern | MetaProperty ] ... ]
ColName
Název sloupce v řádku.
ColType
SQL Server datový typ sloupce v řádkové sadě. Pokud se typy sloupců liší od základního XML datového typu atributu, dochází k nátlaku typu.
ColPattern
Volitelný, obecný vzor XPath, který popisuje, jak by měly být XML uzly mapovány na sloupce. Pokud ColPattern není specifikován, proběhne výchozí mapování (
attribute-centricneboelement-centricmapování podle příznaků).XPath vzor specifikovaný jako ColPattern se používá k určení speciální povahy mapování (pro
attribute-centricaelement-centricmapping), které přepisuje nebo vylepšuje výchozí mapování označené příznaky.Obecný vzor XPath specifikovaný jako ColPattern také podporuje metavlastnosti.
MetaProperty
Jedna z metavlastností poskytovaných .
OPENXMLPokud je specifikována Metavlastnost , sloupec obsahuje informace poskytnuté metavlastností. Metavlastnosti umožňují extrahovat informace (například relativní polohu a informace o jmenném prostoru) o XML uzlech. Tyto metavlastnosti poskytují více informací, než je vidět v textové reprezentaci.
TableName
Název tabulky, který lze dát (místo SchemaDeclaration), pokud tabulka s požadovaným schématem již existuje a nejsou potřeba žádné sloupcové vzory.
Poznámky
Klauzule WITH poskytuje formát řádků (a další mapovací informace podle potřeby) buď pomocí SchemaDeclaration , nebo specifikací existujícího názvu tabulky. Pokud není volitelné WITH ustanovení specifikováno, výsledky se vrátí ve formátu hranné tabulky. Hranové tabulky představují jemně zpracovanou strukturu XML dokumentu (například názvy prvků/atributů, hierarchii dokumentů, jmenné prostory, osobní dotazníky a podobně) v jedné tabulce.
Následující tabulka popisuje strukturu tabulky hran.
| Název sloupce | Datový typ | Description |
|---|---|---|
id |
bigint | Jedinečné ID uzlu dokumentu. Kořenový prvek má ID hodnotu 0. Záporné hodnoty ID jsou rezervované. |
parentid |
bigint | Identifikuje nadřazený uzel. Rodič identifikovaný tímto ID nemusí být nutně rodičovským prvkem, ale záleží na tom uzlu nodetype , jehož rodič je tímto ID identifikován. Například pokud je uzel textovým uzlem, jeho rodičem může být atributový uzel.Pokud je uzel na nejvyšší úrovni v XML dokumentu, je NULLto ParentID . |
nodetype |
int | Identifikuje typ uzlu. Tato hodnota je celé číslo, které odpovídá číslování typu uzlů XML DOM. Typy uzlů jsou:1 = Uzel prvku2 = Atributový uzel3 = Textový uzel |
localname |
nvarchar | Poskytuje místní název elementu nebo atributu.
NULL pokud objekt DOM nemá jméno. |
prefix |
nvarchar | Prefixu názvu jmenného prostoru u názvu uzlu. |
namespaceuri |
nvarchar | Jmenný prostor URI uzlu. Pokud je hodnota , NULLnení přítomen žádný jmenný prostor. |
data type |
nvarchar | Skutečný datový typ prvku nebo řádku atributu, jinak je .NULL Datový typ je odvozen z vloženého DTD nebo z vloženého schématu. |
prev |
bigint | XML ID předchozího sourozeneckého prvku.
NULL Pokud není žádný přímý předchozí sourozenec. |
text |
ntext | Obsahuje hodnotu atributu nebo obsah prvku v textové podobě (nebo je NULL , pokud záznam v hraniční tabulce hodnotu nevyžaduje). |
Examples
A. Použijte základní příkaz SELECT s OPENXML
Následující příklad vytváří interní reprezentaci XML obrázku pomocí sp_xml_preparedocument. Příkaz SELECT používající poskytovatele OPENXML řádků je pak vykonán proti interní reprezentaci XML dokumentu.
Hodnota příznaku je nastavena na 1. Tato hodnota označuje attribute-centric mapování. Proto se XML atributy mapují na sloupce v sadě řádků.
Řádkový vzor uvedený jako /ROOT/Customer identifikuje uzly, které <Customers> mají být zpracovány.
Volitelný parametr ColPattern (sloupcový vzor) není specifikován, protože název sloupce odpovídá jménům XML atributů.
Poskytovatel OPENXML řádků vytváří dvousloupcovou sadu řádků (CustomerID a ContactName), ze které SELECT příkaz získává potřebné sloupce (v tomto případě všechny sloupce).
DECLARE @idoc INT, @doc VARCHAR(1000);
SET @doc = '
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM OPENXML(@idoc, '/ROOT/Customer', 1) WITH (
CustomerID VARCHAR(10),
ContactName VARCHAR(20)
);
Tady je soubor výsledků.
CustomerID ContactName
---------- --------------------
VINET Paul Henriot
LILAS Carlos Gonzlez
Pokud je stejný SELECT příkaz vykonán s příznaky nastavenými na 2, což označuje element-centric mapování, hodnoty CustomerID a pro ContactName oba zákazníky v XML dokumentu se vrátí jako NULL, protože v XML dokumentu nejsou žádné prvky pojmenované CustomerID ani ContactName v něm.
Tady je soubor výsledků.
CustomerID ContactName
---------- -----------
NULL NULL
NULL NULL
B. Specifikujte ColPattern pro mapování mezi sloupci a XML atributy
Následující dotaz vrací ID zákazníka, datum objednávky, ID produktu a atributy množství z XML dokumentu.
Vzor řádků identifikuje <OrderDetails> prvky.
ProductID a Quantity jsou atributy prvku <OrderDetails> . Nicméně OrderID, CustomerID, a jsou OrderDate atributy rodičovského prvku (<Orders>).
Volitelný ColPattern je specifikován pro následující mapování:
T,
OrderIDCustomerID, aOrderDatev sadě řádků se mapují na atributy rodiče uzlů identifikovaných podle vzoru řádku v XML dokumentu.Sloupec
ProdIDv sadě řádků se mapuje na atributProductIDa sloupecQtyv sadě řádků naQuantityatribut uzlů identifikovaných v vzoru řádku.
Ačkoliv je mapování element-centric specifikováno parametrem flags , mapování specifikované v ColPattern toto mapování přepisuje.
DECLARE @idoc INT, @doc VARCHAR(1000);
SET @doc = '
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">v
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM OPENXML(@idoc, '/ROOT/Customer/Order/OrderDetail', 2) WITH (
OrderID INT '../@OrderID',
CustomerID VARCHAR(10) '../@CustomerID',
OrderDate DATETIME '../@OrderDate',
ProdID INT '@ProductID',
Qty INT '@Quantity'
);
Tady je soubor výsledků.
OrderID CustomerID OrderDate ProdID Qty
------------------------------------------------------------------------
10248 VINET 1996-07-04 00:00:00.000 11 12
10248 VINET 1996-07-04 00:00:00.000 42 10
10283 LILAS 1996-08-16 00:00:00.000 72 3
C. Získejte výsledky ve formátu tabulky hran
Ukázkový XML dokument v následujícím příkladu se skládá z <Customers>, <Orders>, a <Order_0020_Details> prvků. Nejprve sp_xml_preparedocument je volán k získání dokumentového rukojeti. Tento dokument je předán na OPENXML.
V příkazu OPENXMLřádkový vzor (/ROOT/Customers) identifikuje <Customers> uzly k zpracování. Protože klauzule není poskytnuta WITH , OPENXML vrací řádkovou sadu ve formátu hranné tabulky.
Nakonec SELECT příkaz načte všechny sloupce v hranové tabulce.
DECLARE @idoc INT, @doc VARCHAR(1000);
SET @doc = '
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot">
<Orders CustomerID="VINET" EmployeeID="5" OrderDate=
"1996-07-04T00:00:00">
<Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
<Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
</Orders>
</Customers>
<Customers CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Orders CustomerID="LILAS" EmployeeID="3" OrderDate=
"1996-08-16T00:00:00">
<Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/>
</Orders>
</Customers>
</ROOT>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- SELECT statement that uses the OPENXML rowset provider.
SELECT * FROM OPENXML(@idoc, '/ROOT/Customers')
EXEC sp_xml_removedocument @idoc;