Udostępnij za pośrednictwem


Using FOR XML and OPENXML to Publish and Process XML Data

Można wykonać kwerendy SQL zwraca wyniki w formacie XML zamiast standardowego zestawów wierszy.Te kwerendy mogą być wykonane bezpośrednio lub wykonanych od w ramach procedur przechowywanych i zdefiniowanych przez użytkownika funkcji.Aby bezpośrednio pobrać wyniki, należy najpierw użyć klauzula XML dla instrukcja SELECT.Następnie w klauzula FOR XML, należy określić tryb XML: RAW, AUTO, EXPLICIT lub ścieżka.

Na przykład następujące SELECT Instrukcja pobiera informacje z Sales.Customer i Sales.SalesOrderHeader tabele w AdventureWorks Baza danych. Ta kwerenda określa AUTO tryb w FOR XML Klauzula:

USE AdventureWorks
GO
SELECT Cust.CustomerID, 
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID, 
       OrderHeader.Status,
       Cust.CustomerType
FROM Sales.Customer Cust 
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO

Dlatego do pobierania danych w postaci dokumentu XML, można użyć klauzula FOR XML, można użyć Transact-SQL Funkcja OPENXML, aby wstawić dane reprezentowane w postaci dokumentu XML. OPENXML jest podobna do tabela lub w widoku zestawu zestaw wierszy dostawca i zapewnia zestawu zestaw wierszy za pośrednictwem dokumentów XML, znajdujących się w pamięci.OPENXML umożliwia uzyskanie dostępu do danych XML, tak jakby był on relacyjnej zestaw wierszy, zapewniając widok zestawu wierszy z reprezentacji wewnętrznej dokumentu XML.Rekordy w zestawie zestaw wierszy mogą być przechowywane w tabelach bazy danych.OPENXML mogą być używane w instrukcji SELECT i SELECT INTO, w którym można określić urządzenie źródłowe tabela lub widoku.

W poniższym przykładzie pokazano użycie OPENXML w INSERT Instrukcja i SELECT Instrukcja. Zawiera przykładowy dokument XML <Customers> i <Orders> elementy.

Pierwszy, sp_xml_preparedocument Procedura przechowywana przeanalizowaniu dokumentu XML. The parsed document is a tree representation of the nodes (elements, attributes, text, and comments) in the XML document.OPENXML then refers to this parsed XML document and provides a rowset view of all or parts of this XML document.An INSERT instrukcja using OPENXML can insert data from such a zestaw wierszy into a database tabela. Kilka OPENXML wywołania umożliwia udostępnienie widoku zestawu zestaw wierszy z różnych części dokumentu XML i przetwarzać je, na przykład, wstawiając je do różnych tabel. Ten proces jest również określany jako rozdrabniania XML do tabel.

W poniższym przykładzie dokument XML jest rozdrobniony w sposób, że <Customers> elementy są przechowywane w Customers Tabela i <Orders> elementy są przechowywane w Orders tabelę za pomocą dwóch INSERT instrukcje. W przykładzie pokazuje także SELECT Wyciąg z OPENXML które pobiera CustomerID i OrderDate z dokumentu XML. Ostatnim etapem w procesie jest wywołania sp_xml_removedocument. Można to zrobić, aby zwolnić pamięć przydzielona do reprezentacji wewnętrznej drzewa XML, który został utworzony w fazie analizy.

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

Na poniższej ilustracji przedstawiono poprzedniego dokumentu XML, który został utworzony za pomocą sp_xml_preparedocument zanalizowano drzewo składni XML.

Parsed XML tree