Udostępnij za pomocą


OPENXML (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

OPENXML zapewnia widok wiersza nad dokumentem XML. Ponieważ OPENXML jest dostawcą wiersza, może być używany w Transact-SQL instrukcjach, OPENXML w których mogą pojawić się dostawcy wierszy, takich jak tabela, widok czy OPENROWSET funkcja.

Transact-SQL konwencje składni

Składnia

OPENXML ( idoc int [ in ]
    , rowpattern nvarchar [ in ]
    , [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]

Arguments

IDoc

Uchwyt dokumentu wewnętrznej reprezentacji dokumentu XML. Wewnętrzna reprezentacja dokumentu XML jest tworzona przez wywołanie sp_xml_preparedocument.

Wzorzec wierszy

Wzorzec XPath używany do identyfikacji węzłów przetwarzanych jako wierszy. Węzły pochodzą z dokumentu XML, którego uchwyt jest przekazywany w parametrze idoc .

flags

Wskazuje mapowanie używane między danymi XML a relacyjnym zestawem wierszy oraz sposób wypełniania kolumny przelewającej. flagi są opcjonalnym parametrem wejściowym i mogą być jedną z następujących wartości.

Wartość bajtów Description
0 Domyślnie ustawia się na attribute-centric mapowanie.
1 Użyj attribute-centric mapowania. Można połączyć z XML_ELEMENTS. W tym przypadku attribute-centric najpierw stosuje się odwzorowanie. Następnie element-centric stosuje się mapowanie dla pozostałych kolumn.
2 Użyj element-centric mapowania. Można połączyć z XML_ATTRIBUTES. W tym przypadku element-centric najpierw stosuje się odwzorowanie. Następnie attribute-centric stosuje się mapowanie dla pozostałych kolumn.
8 Można łączyć (logiczne OR) z XML_ATTRIBUTES lub XML_ELEMENTS. W kontekście pobierania ta flaga wskazuje, że zużyte dane nie powinny być kopiowane do właściwości @mp:xmltextprzepełnienia .

Deklaracja schematu

Definicja schematu formy: ColNameColType [ ColPattern | MetaProperty ] [ , ColNameColType [ ColPattern | MetaProperty ] ... ]

  • ColName

    Nazwa kolumny w zestawie wierszy.

  • ColType

    Typ danych SQL Server w kolumnie w wierszu. Jeśli typy kolumn różnią się od podstawowego typu danych xml atrybutu, następuje przymus typu.

  • ColPattern

    Opcjonalny, ogólny wzór XPath, który opisuje, jak węzły XML powinny być mapowane na kolumny. Jeśli ColPattern nie jest określony, domyślne mapowanie (attribute-centric lub element-centric mapowanie określone przez flagi) następuje.

    Wzorzec XPath określony jako ColPattern służy do określenia specjalnego charakteru mapowania (dla attribute-centric i element-centric mapowania), które nadpisuje lub wzmacnia domyślne mapowanie wskazane przez flagi.

    Ogólny wzorzec XPath określony jako ColPattern również obsługuje metawłaściwości.

  • MetaProperty

    Jedna z metawłaściwości dostarczanych przez OPENXML. Jeśli podano MetaProperty , kolumna zawiera informacje dostarczone przez metaproperty. Metawłaściwości pozwalają wyodrębnić informacje (takie jak względne położenie i informacje o przestrzeni nazw) o węzłach XML. Te metawłaściwości dostarczają więcej informacji niż jest widoczne w reprezentacji tekstowej.

TableName

Nazwa tabeli można nadać (zamiast SchemaDeclaration), jeśli tabela z pożądanym schematem już istnieje i nie są wymagane wzorce kolumn.

Uwagi

Klauzula WITH zapewnia format wiersza (oraz dodatkowe informacje mapujące w razie potrzeby) poprzez użycie SchemaDeclaration lub określenie istniejącej nazwy tabeli. Jeśli klauzula opcjonalna WITH nie jest określona, wyniki są zwracane w formacie tabeli krawędziowej . Tabele brzegów reprezentują szczegółową strukturę dokumentu XML (taką jak nazwy elementów/atrybutów, hierarchia dokumentów, przestrzenie nazw, Pi itd.) w jednej tabeli.

Poniższa tabela opisuje strukturę tabeli krawędzi .

Nazwa kolumny Typ danych Description
id bigint Unikalny identyfikator węzła dokumentu.

Element główny ma wartość 0ID . Wartości identyfikatorów ujemnych są zarezerwowane.
parentid bigint Identyfikuje element nadrzędny węzła. Rodzic zidentyfikowany przez ten identyfikator niekoniecznie jest elementem nadrzędnym, ale zależy to od węzła nodetype , którego rodzic jest identyfikowany tym ID. Na przykład, jeśli węzeł jest węzłem tekstowym, jego nadrzędnym może być węzeł atrybutów.

Jeśli węzeł znajduje się na najwyższym poziomie w dokumencie XML, jest on ParentID .NULL
nodetype int Identyfikuje typ węzła. Ta wartość jest liczbą całkowitą odpowiadającą numeracji typu węzła XML DOM. Typy węzłów to:

1 = Węzeł elementu
2 = Węzeł atrybutów
3 = Węzeł tekstowy
localname nvarchar Nadaje nazwę lokalną elementu lub atrybutu. NULL jeśli obiekt DOM nie ma nazwy.
prefix nvarchar Prefiks nazwy w przestrzeni nazw węzła.
namespaceuri nvarchar Przestrzeń nazw URI węzła. Jeśli wartość to NULL, nie ma przestrzeni nazw.
data type nvarchar Rzeczywisty typ danych wiersza elementu lub atrybutu, w przeciwnym razie to .NULL Typ danych jest wywnioskowany z wbudowanego identyfikatora DTD lub ze schematu wbudowanego.
prev bigint ID XML poprzedniego elementu rodzeństwa. NULL Jeśli nie ma bezpośredniego wcześniejszego rodzeństwa.
text ntext Zawiera wartość atrybutu lub zawartość elementu w formie tekstowej (albo jest, NULL jeśli wpis w tabeli krawędzi nie wymaga wartości).

Przykłady

A. Użyj podstawowego polecenia SELECT z OPENXML

Poniższy przykład tworzy wewnętrzną reprezentację obrazu XML za pomocą sp_xml_preparedocument. Następnie wykonywane SELECT jest zdanie wykorzystujące dostawcę OPENXML wiersza na wewnętrznej reprezentacji dokumentu XML.

Wartość flagi jest ustawiona na .1 Ta wartość oznacza attribute-centric odwzorowanie. Dlatego atrybuty XML odpowiadają kolumnom w zestawie wierszy. Wzorzec wiersza określony jako /ROOT/Customer identyfikuje węzły <Customers> do przetwarzania.

Opcjonalny parametr ColPattern (wzorzec kolumnowy) nie jest określony, ponieważ nazwa kolumny odpowiada nazwam atrybutów XML.

Dostawca OPENXML wiersza tworzy dwukolumnowy zestaw wierszy (CustomerID i ContactName), z którego SELECT polecenie pobiera niezbędne kolumny (w tym przypadku wszystkie kolumny).

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)
);

Oto zestaw wyników.

CustomerID ContactName
---------- --------------------
VINET      Paul Henriot
LILAS      Carlos Gonzlez

Jeśli SELECT wykona się to samo zdanie z flagami ustawionymi na 2, wskazującymi element-centric mapowanie, wartości CustomerID i dla ContactName obu klientów w dokumencie XML są zwracane jako NULL, ponieważ w dokumencie XML nie ma żadnych elementów nazwanych CustomerID ani ContactName w dokumencie XML.

Oto zestaw wyników.

CustomerID ContactName
---------- -----------
NULL       NULL
NULL       NULL

B. Określ ColPattern do mapowania między kolumnami a atrybutami XML

Poniższe zapytanie zwraca identyfikator klienta, datę zamówienia, ID produktu oraz atrybuty ilości z dokumentu XML. Wzorzec wierszy identyfikuje elementy<OrderDetails>. ProductID i Quantity są atrybutami danego pierwiastka <OrderDetails> . Jednak OrderID, , oraz OrderDate są atrybutami elementu nadrzędnego (<Orders>CustomerID).

Opcjonalny ColPattern jest określony dla następujących odwzorowań:

  • T, OrderIDCustomerID, oraz OrderDate w zestawie wierszy odpowiadają atrybutom rodzica węzłów zidentyfikowanych przez wzorzec wiersza w dokumencie XML.

  • Kolumna ProdID w zestawie wierszy odpowiada na atrybut, ProductID a kolumna Qty w zestawie wierszy na Quantity atrybut węzłów zidentyfikowanych w wzorcu wiersza.

Chociaż element-centric mapowanie jest określone przez parametr flagów , odwzorowanie określone w ColPattern nadpisuje to odwzorowanie.

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'
);

Oto zestaw wyników.

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. Uzyskaj wyniki w formacie tabeli krawędziowej

Przykładowy dokument XML w poniższym przykładzie składa się z <Customers>, <Orders>, oraz <Order_0020_Details> elementów. Najpierw wywołuje się, sp_xml_preparedocument aby uzyskać uchwyt dokumentu. Ten uchwyt dokumentu jest przekazywany do OPENXML.

W OPENXML instrukcji wzorzec wiersza (/ROOT/Customers) identyfikuje węzły <Customers> do przetwarzania. Ponieważ klauzula nie jest dostarczona WITH , OPENXML zwraca zestaw wierszy w formacie tabeli brzegowej .

Na koniec SELECT zdanie pobiera wszystkie kolumny w tabeli krawędzi .

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;