Sdílet prostřednictvím


OPENXML (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL 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.

Transact-SQL konvence syntaxe

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-centric nebo element-centric mapování podle příznaků).

    XPath vzor specifikovaný jako ColPattern se používá k určení speciální povahy mapování (pro attribute-centric a element-centric mapping), 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 .OPENXML Pokud 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 prvku
2 = Atributový uzel
3 = 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, a OrderDate v sadě řádků se mapují na atributy rodiče uzlů identifikovaných podle vzoru řádku v XML dokumentu.

  • Sloupec ProdID v sadě řádků se mapuje na atribut ProductID a sloupec Qty v sadě řádků na Quantity atribut 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;