Aracılığıyla paylaş


OPENXML (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

OPENXML bir XML belgesi üzerinde bir sıra kümesi görünümü sağlar. Çünkü OPENXML bir satır kümesi sağlayıcısıdır, OPENXML tablo, görünüm veya OPENROWSET fonksiyon gibi satır kümesi sağlayıcılarının görünebileceği Transact-SQL ifadelerinde kullanılabilir.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

Arguments

IDOC

Bir XML belgesinin iç temsilinin belge tutamacı. Bir XML belgesinin iç temsili .sp_xml_preparedocument

rowpattern

XPath deseni, işlenecek düğümleri satır olarak tanımlamak için kullanılır. Düğümler, idoc parametresinde kullanılan XML belgesinden gelir.

flags

XML veri ile ilişkisel satır kümesi arasındaki eşlemeyi ve splay-over sütununun nasıl doldurulduğunu gösterir. bayraklar isteğe bağlı bir giriş parametresidir ve aşağıdaki değerlerden biri olabilir.

Bayt değeri Description
0 Varsayılan olarak haritalamaya attribute-centric geçiyor.
1 Haritalamayı attribute-centric kullanın. ile XML_ELEMENTSbirleştirilebilir. Bu durumda attribute-centric önce eşleme uygulanır. Sonra, element-centric kalan sütunlar için eşleme uygulanır.
2 Haritalamayı element-centric kullanın. ile XML_ATTRIBUTESbirleştirilebilir. Bu durumda element-centric önce eşleme uygulanır. Sonra, attribute-centric kalan sütunlar için eşleme uygulanır.
8 Birleştirilebilir (mantıklı VEYA veya XML_ATTRIBUTES veya XML_ELEMENTSile ). Alma bağlamında, bu bayrak tüketilen verinin taşma özelliğine @mp:xmltextkopyalanmaması gerektiğini gösterir.

Şema Deklarasyonu

Formun şema tanımı: ColNameColType [ ColPattern | MetaProperty ] [ , ColNameColType [ ColPattern | MetaProperty ] ... ]

  • ColName

    Satır kümesindeki sütun adı.

  • ColType

    Sıralı kümedeki sütunun SQL Server veri tipi. Eğer sütun tipleri, özniteliğin altta yatan xml veri tipinden farklıysa, tür zorlayıcılığı gerçekleşir.

  • ColPattern

    XML düğümlerinin sütunlara nasıl eşleneceğini açıklayan isteğe bağlı, genel bir XPath desenidir. Eğer ColPattern belirtilmemişse, varsayılan eşleme (attribute-centricveya element-centricbayraklarla belirtilen eşleme) gerçekleşir.

    ColPattern olarak belirtilen XPath deseni, bayraklarla belirtilen varsayılan eşlemenin üzerine yazan veya geliştiren özel eşlemenin (ve attribute-centricelement-centric eşleme) özel doğasını belirtmek için kullanılır.

    ColPattern olarak belirtilen genel XPath deseni de meta özellikleri destekler.

  • MetaProperty

    Tarafından OPENXMLsağlanan meta özelliklerden biri. MetaProperty belirtilmişse, sütun metaproperty tarafından sağlanan bilgileri içerir. Meta özellikler, XML düğümleri hakkında bilgi (örneğin göreceli konum ve isim alanı bilgisi) çıkarmanıza olanak tanır. Bu meta özellikler, metin temsilinde görünenden daha fazla bilgi sağlar.

Tablo Adı

İstenilen şemaya sahip bir tablo zaten varsa ve sütun desenleri gerekmiyorsa ( SchemaDeclaration yerine) verilebilecek tablo adı.

Açıklamalar

Bu madde, WITHSchemaDeclaration kullanılarak veya mevcut bir TabloName belirterek bir satır kümesi formatı (ve gerektiğinde ek eşleme bilgisi) sağlar. Isteğe WITH bağlı madde belirtilmemişse, sonuçlar kenar tablosu formatında döner. Kenar tablolar, ince tanenli XML belge yapısını (eleman/öznitelik adları, belge hiyerarşisi, isim alanları, PI'ler vb.) tek bir tabloda temsil eder.

Aşağıdaki tablo, kenar tablosunun yapısını açıklar.

Sütun adı Veri türü Description
id bigint Belge düğümünün benzersiz kimliği.

Kök elemanın bir ID değeri 0vardır. Negatif kimlik değerleri ayrılmıştır.
parentid bigint Düğümün üst öğesini tanımlar. Bu ID ile tanımlanan ebeveyn mutlaka ebeveyn eleman değildir, ancak bu kimlik ile tanımlanan ebeveyn düğümün ana öğesine bağlıdır nodetype . Örneğin, düğüm bir metin düğümü ise, onun ebeveyni bir nitelik düğümü olabilir.

Eğer düğüm XML belgesinde en üst seviyedeyse, ParentIDNULL'dir.
nodetype int Düğüm tipini belirler. Bu değer, XML DOM düğüm tipi numaralandırmasına karşılık gelen bir tam sayıdır. Düğüm türleri şunlardır:

1 = Element düğümü
2 = Öznitelik düğümü
3 = Metin düğümü
localname nvarchar Öğenin veya özniteliğin yerel adını verir. NULL DOM nesnesinin adı yoksa.
prefix nvarchar Düğüm adının isim alanı öneki.
namespaceuri nvarchar Düğümün isim alanı URI'si. Değer ise NULL, bir isim alanı yoktur.
data type nvarchar Öğenin veya öznitelik satırının gerçek veri türü, aksi takdirde 'dir.NULL Veri türü satır içi DTD'den veya satır içi şemadan çıkarılır.
prev bigint Önceki kardeş öğenin XML ID'si. NULL doğrudan önceki kardeş yoksa.
text ntext Özellik değerini veya öğe içeriğini metin formunda içerir (veya kenar tablo girişi değer gerektirmiyorsa).NULL

Örnekler

A. OPENXML ile temel bir SELECT ifadesi kullanın

Aşağıdaki örnek, XML görüntüsünün iç bir temsilini oluşturur.sp_xml_preparedocument Bir OPENXML sıra kümesi sağlayıcısı kullanan bir SELECT ifade, XML belgesinin iç temsiline karşı yürütülür.

Bayrak değeri olarak ayarlanmıştır1. Bu değer eşlemeyi gösterir attribute-centric . Bu nedenle, XML öznitelikleri satır kümesindeki sütunlara eşlenir. Belirtilen /ROOT/Customer<Customers>sıralı desen, işlenilecek düğümleri tanımlar.

Isteğe bağlı ColPattern (sütun deseni) parametresi belirtilmez çünkü sütun adı XML öznitelik adlarıyla eşleşir.

Satır kümesi sağlayıcısı OPENXML , ifadenin gerekli sütunları (bu durumda tüm sütunları) aldığı iki sütunlu bir satır kümesi (CustomerID ve ContactName) SELECT oluşturur.

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

Sonuç kümesi aşağıdadır.

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

Aynı SELECT ifade , eşlemeyi gösteren 2element-centricbayraklar ayarlanmış olarak çalıştırılırsa, XML belgesinde NULLher iki müşterinin ve ContactName değerlerinin CustomerID değerleri , çünkü XML belgesinde herhangi bir öğe yoktur CustomerIDContactName.

Sonuç kümesi aşağıdadır.

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

B. Sütunlar ile XML öznitelikleri arasındaki eşleme için ColPattern belirtin

Aşağıdaki sorgu, XML belgesinden müşteri kimliği, sipariş tarihi, ürün kimliği ve miktar özelliklerini geri getirir. Sıra deseni elementleri <OrderDetails> tanımlar. ProductID ve Quantity elementin özellikleridir <OrderDetails> . Ancak, OrderID, , ve OrderDate ana elemanın (<Orders>) öznitelikleridirCustomerID.

Opsiyonel ColPattern aşağıdaki eşlemeler için belirtilmiştir:

  • OrderIDSıra kümesindeki , CustomerID, ve OrderDate XML belgesinde sıralı desen ile tanımlanan düğümlerin ebeveyn özelliklerine eşlenir.

  • Satır kümesindeki sütun ProdID özniteliğe ProductID eşlenirken, Qty satır kümesindeki sütun ise sıralı desende tanımlanan düğümlerin özniteliğine eşlenirQuantity.

Eşleme, element-centricbayrak parametresi tarafından belirlenmiş olsa da, ColPattern'ta belirtilen eşleme bu eşlemenin üzerine yazılır.

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

Sonuç kümesi aşağıdadır.

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. Sonuçları kenar tablosu formatında elde edin

Aşağıdaki örnekteki örnek XML belgesi , <Orders>, ve <Order_0020_Details> elemanlardan <Customers>oluşur. Birincisi, sp_xml_preparedocument bir belge handle almak için çağrılır. Bu belge hesabı 'ye OPENXMLgeçirilir.

Bu ifadede OPENXML , sıralı desen (/ROOT/Customers) işlenecek düğümleri tanımlar <Customers> . Kümlek WITH sağlanmadığı için, OPENXML satır kümesi kenar tablo formatında döndürülür.

Son olarak, ifade SELECTkenar tablosundaki tüm sütunları geri alır.

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;