Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza 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-centriclubelement-centricmapowanie określone przez flagi) następuje.Wzorzec XPath określony jako ColPattern służy do określenia specjalnego charakteru mapowania (dla
attribute-centricielement-centricmapowania), 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ł elementu2 = Węzeł atrybutów3 = 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, orazOrderDatew zestawie wierszy odpowiadają atrybutom rodzica węzłów zidentyfikowanych przez wzorzec wiersza w dokumencie XML.Kolumna
ProdIDw zestawie wierszy odpowiada na atrybut,ProductIDa kolumnaQtyw zestawie wierszy naQuantityatrybut 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;