Aracılığıyla paylaş


Yayımlama ve işlem IÇIN XML ve OPENXML kullanarak XML verisi

sonuçlar, standart Satır kümeleri yerine XML olarak döndürmek için SQL sorgularını çalıştırabilirsiniz.Bu sorgular, doğrudan yürütülen veya saklı yordam içindeki tarafından yürütülen ve kullanıcı tanımlı işlevler olabilir.Doğrudan sonuçlar almak için ilk SELECT deyim FOR XML yan tümce kullanın.Ardından FOR XML yan tümce içinde bir XML modu belirtin: RAW, AUTO, EXPLICIT veya yol.

Örneğin, aşağıdakiSELECTdeyim bilgileri alırSales.CustomerveSales.SalesOrderHeader tablolar,AdventureWorksveritabanı.Bu sorguyu belirtirAUTOmodundaFOR XMLyan:

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

FOR XML yan tümce, bir XML belgesi olarak veri almak için kullanabilirsiniz, ancak kullanabileceğinizTransact-SQLOPENXML işlev ekleme veri temsil edilen bir XML belgesi.OPENXML bir tablo veya Görünüm için benzer bir satır kümesi sağlayıcı ve bellekte olan XML belgeleri üzerinde bir satır kümesi sağlar.Bir XML belgesine iç gösterimi satır bir görünümünü sağlayarak ilişkili bir satır kümesi gibi OPENXML XML verilerine erişim sağlar.satır kümesi kümesi kayıtlarında veritabanı tablolarında saklanır.OPENXML SELECT ve SELECT INTO deyimlerinde, kaynak tablo veya Görünüm belirlendiği kullanılabilir.

Aşağıdaki örnek kullanımını gösterirOPENXML, birINSERTdeyim veSELECTdeyim.Örnek XML belgesi içeriyor<Customers>ve<Orders>öğeleri.

Öncesp_xml_preparedocumentsaklı yordam ayrıştırmak için kullandığı XML belgesi.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.AnINSERTusing deyimOPENXMLveri veritabanına böyle satır kümesi kümesi ekleyebilirsiniz tablo.Birden fazlaOPENXMLçağrı, bir XML belgesinin çeşitli bölümlerine satır kümesi kümesi görünümü sağlar ve bunları, örneğin, işlem'in farklı tablolar. ekleyerek için kullanılabilirBu işlem da XML tablolarına shredding olarak adlandırılır.

Aşağıdaki örnekte, XML belgesinin bir şekilde shredded,<Customers>öğelerin depolandığıCustomersTablo ve<Orders>öğelerin depolandığıOrdersTablo kullanarak ikiINSERTifadeler.Örnekte de gösterildiği birSELECTdeyim ileOPENXMLalırCustomerIDveOrderDateXML belgesi.İşleminde son adım olan aramak içinsp_xml_removedocument.Bu, ayrıştırma aşamasında oluşturulan iç XML ağacının gösterimi içermesi için ayrılan bellek serbest bırakmak için yapılır.

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

Aşağıdaki resimde sp_xml_preparedocument kullanılarak oluşturulmuş önceki XML belgesinin ayrıştırılmış XML ağacını gösterir.

Parsed XML tree