Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
OPENXML, bir tabloya veya görünüme benzer bellek içi XML belgeleri üzerinde satır kümesi sağlayan Transact-SQL bir anahtar sözcüktür. OPENXML, XML verilerine ilişkisel bir satır kümesi gibi erişim sağlar. Bunu, xml belgesinin iç gösteriminin satır kümesi görünümünü sağlayarak yapar. Satır kümesindeki kayıtlar veritabanı tablolarında depolanabilir.
OPENXML, satır kümesi sağlayıcılarının, bir görünümün veya OPENROWSET'in kaynak olarak görünebileceği her yerde SELECT ve SELECT INTO deyimlerinde kullanılabilir. OPENXML söz dizimi hakkında bilgi için bkz. OPENXML (Transact-SQL).
OPENXML kullanarak bir XML belgesine sorgu yazmak için önce sp_xml_preparedocument çağırmanız gerekir. Bu, XML belgesini ayrıştırarak ayrıştırılmış belgeye tüketime hazır bir tanıtıcı döndürür. Ayrıştırılan belge, XML belgesindeki çeşitli düğümlerin belge nesne modeli (DOM) ağaç gösterimidir. Belge tanıtıcısı OPENXML'ye geçirilir. OPENXML daha sonra, belgeye geçirilen parametrelere göre belgenin satır kümesi görünümünü sağlar.
Uyarı
sp_xml_preparedocument MSXML ayrıştırıcısının SQL tarafından güncelleştirilmiş bir sürümünü Msxmlsql.dllkullanır. MSXML ayrıştırıcısının bu sürümü, SQL Server'ı destekleyecek ve MSXML sürüm 2.6 ile geriye dönük olarak uyumlu kalacak şekilde tasarlanmıştır.
Bir XML belgesinin iç gösterimi, belleği boşaltmak için sp_xml_removedocument sistem saklı yordamı çağrılarak bellekten kaldırılmalıdır.
Aşağıdaki çizimde işlemi gösterilmektedir.
OPENXML'yi anlamak için XPath sorguları hakkında bilgi sahibi olmak ve XML'yi anlamak gerektiğini unutmayın. SQL Server'da XPath desteği hakkında daha fazla bilgi için bkz. SQLXML 4.0'da XPath Sorgularını Kullanma.
Uyarı
OpenXML, satır ve sütun XPath desenlerinin değişken olarak parametreleştirilmesini sağlar. Programcı parametreleştirmeyi dış kullanıcılara gösteriyorsa (örneğin, parametreler harici olarak adlandırılan bir saklı yordam aracılığıyla sağlanıyorsa) bu parametreleştirme XPath ifade eklemelerine yol açabilir. Bu tür olası güvenlik sorunlarını önlemek için XPath parametrelerinin hiçbir zaman dış arayanlara gösterilmemesi önerilir.
Example
Aşağıdaki örnek, bir OPENXML deyiminin ve bir INSERT deyiminin içinde SELECT kullanımını göstermektedir. Örnek XML belgesi <Customers> ve <Orders> öğelerini içerir.
İlk olarak, sp_xml_preparedocument saklı yordam XML belgesini ayrıştırıyor. Ayrıştırılan belge, XML belgesindeki düğümlerin (öğeler, öznitelikler, metin ve açıklamalar) ağaç gösterimidir.
OPENXML ardından bu ayrıştırılmış XML belgesine başvurur ve bu XML belgesinin tüm veya bölümlerinin satır kümesi görünümünü sağlar.
INSERT kullanan bir OPENXML deyimi, böyle bir satır kümesinden veritabanı tablosuna veri ekleyebilir. XML belgesinin çeşitli bölümlerinin satır kümesi görünümünü sağlamak ve bunları farklı tablolara ekleyerek işlemek için çeşitli OPENXML çağrılar kullanılabilir. Bu işlem XML verinin tablolara ayrıştırılması olarak da adlandırılır.
Aşağıdaki örnekte, bir XML belgesi iki <Customers> deyimi kullanılarak parçalanmış olup, Customers öğeleri <Orders> tablosunda ve Orders öğeleri INSERT tablosunda depolanmıştır. Örnek ayrıca XML belgesinden SELECT ve OPENXML alan CustomerID deyimini OrderDate gösterir. İşlemin son adımı çağrısı sp_xml_removedocumentyapmaktır. Bu, ayrıştırma aşamasında oluşturulan iç XML ağacı gösterimini içerecek şekilde ayrılan belleği 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 çizimde, sp_xml_preparedocument kullanılarak oluşturulan önceki XML belgesinin ayrıştırılmış XML ağacı gösterilmektedir.
OPENXML parametreleri
OPENXML parametreleri şunları içerir:
XML belge tanıtıcısı (idoc)
Satırlara eşlenecek düğümleri tanımlamak için bir XPath ifadesi (satır satırı)
Oluşturulacak satır kümesinin açıklaması
Satır kümesi sütunları ve XML düğümleri arasında eşleme
XML belge tanıtıcısı (idoc)
Belge tanıtıcısı sp_xml_preparedocument saklı yordamı tarafından döndürülür.
İşlenecek düğümleri tanımlamak için XPath ifadesi (satır satırı)
Satır satırı olarak belirtilen XPath ifadesi, XML belgesinde bir düğüm kümesi tanımlar. Rowpattern tarafından tanımlanan her düğüm, OPENXML tarafından oluşturulan satır kümesindeki tek bir satıra karşılık gelir.
XPath ifadesi tarafından tanımlanan düğümler, XML belgesindeki herhangi bir XML düğümü olabilir. Rowpattern XML belgesinde bir öğe kümesi tanımlarsa, tanımlanan her öğe düğümü için satır kümesinde bir satır vardır. Örneğin, rowpattern bir öznitelikle bitiyorsa, rowpattern tarafından seçilen her öznitelik düğümü için bir satır oluşturulur.
Oluşturulacak satır kümesinin açıklaması
Sonuç satır kümesini oluşturmak için OPENXML tarafından bir satır kümesi şeması kullanılır. Satır kümesi şemasını belirtirken aşağıdaki seçenekleri kullanabilirsiniz.
Kenar tablo biçimini kullanma
Satır kümesi şeması belirtmek için kenar tablo biçimini kullanmanız gerekir. WITH yan tümcesini kullanmayın.
Bunu yaptığınızda, OPENXML kenar tablo biçiminde bir satır kümesi döndürür. Ayrıştırılmış XML belge ağacındaki her kenar satır kümesindeki bir satıra eşlendiğinden bu, kenar tablosu olarak adlandırılır.
Kenar tabloları, tek bir tablo içinde ayrıntılı XML belge yapısını gösterir. Bu yapı öğe ve öznitelik adlarını, belge hiyerarşisini, ad alanlarını ve işleme yönergelerini içerir. Kenar tablo biçimi, meta özellikler aracılığıyla sunulmamış ek bilgiler edinmenizi sağlar. Meta özellikler hakkında daha fazla bilgi için bkz. OPENXML'de MetaÖzellikler Belirtme.
Kenar tablosu tarafından sağlanan ek bilgiler, bir öğenin ve özniteliğin veri türünü ve düğüm türünü depolamanıza ve sorgulamanıza, ayrıca XML belge yapısıyla ilgili bilgileri depolamanıza ve sorgulamanıza olanak tanır. Bu ek bilgilerle, kendi XML belge yönetim sisteminizi de oluşturabilirsiniz.
Kenar tablosunu kullanarak, XML belgelerini ikili büyük nesne (BLOB) girişi olarak alan ve kenar tablosunu ürettikten sonra belgeyi daha ayrıntılı bir düzeyde çözümleyip analiz eden saklı yordamlar yazabilirsiniz. Bu ayrıntılı düzey belge hiyerarşisini, öğe ve öznitelik adlarını, ad alanlarını ve işleme yönergelerini bulmayı içerebilir.
Kenar tablosu, diğer ilişkisel biçimlerle eşleme mantıksal olmadığında ve ntext alanı yeterli yapısal bilgi sağlamadığında XML belgeleri için bir depolama biçimi işlevi de görebilir.
XML belgesini incelemek için XML ayrıştırıcısı kullanabileceğiniz durumlarda, aynı bilgileri almak için bunun yerine bir kenar tablosu kullanabilirsiniz.
Aşağıdaki tabloda kenar tablosunun yapısı açıklanmaktadır.
| Sütun adı | Veri türü | Description |
|---|---|---|
| ID | bigint | Belge düğümünün benzersiz kimliğidir. Kök öğenin kimlik değeri 0'dır. Negatif ID değerleri rezerve edilmiştir. |
| parentid | bigint | Düğümün ebeveynini tanımlar. Bu kimlikle tanımlanan ebeveyn öğe mutlaka ana öğe değildir. Ancak bu, ebeveyni bu kimlikle tanımlanan düğümün NodeType'ına bağlıdır. Örneğin, düğüm bir metin düğümüyse, üst öğesi bir öznitelik düğümü olabilir. Düğüm XML belgesinde en üst düzeydeyse ParentID değeri NULL olur. |
| düğüm türü | int | Düğüm türünü tanımlar ve XML nesne modeli (DOM) düğüm türü numaralandırmasına karşılık gelen bir tamsayıdır. Aşağıda, düğüm türünü belirtmek için bu sütunda gösterilebilen değerler bulunur: 1 = Öğe düğümü 2 = Öznitelik düğümü 3 = Metin düğümü 4 = CDATA bölüm düğümü 5 = Varlık başvuru düğümü 6 = Varlık düğümü 7 = İşlem yönergesi düğümü 8 = Açıklama düğümü 9 = Belge düğümü 10 = Belge Türü düğümü 11 = Belge Kırpım Düğümü 12 = Gösterimi düğümü Daha fazla bilgi için Microsoft XML (MSXML) SDK'sında "nodeType Özelliği" makalesine bakın. |
| localname | nvarchar(max) | Öğenin veya özniteliğin yerel adını verir. DOM nesnesinin adı yoksa NULL olur. |
| önek | nvarchar(max) | Düğüm adının ad alanı ön ekidir. |
| namespaceuri | nvarchar(max) | Düğümün ad alanı URI'sidir. Değer NULL ise, ad alanı bulunmamaktadır. |
| Datatype | nvarchar(max) | Öğenin veya öznitelik satırının gerçek veri türüdür ve aksi takdirde NULL değeridir. Veri türü satır içi DTD'den veya satır içi şemadan çıkarılır. |
| Önceki | bigint | Önceki eşdüzey öğenin XML kimliğidir. Önceki doğrudan eşdüzey yoksa NULL olur. |
| text | ntext | Metin biçiminde öznitelik değerini veya öğe içeriğini içerir. Veya kenar tablosu girdisinin bir değere ihtiyacı yoksa NULL olur. |
Var olan bir tabloyu belirtmek için WITH yan tümcesini kullanma
Var olan bir tablonun adını belirtmek için WITH yan tümcesini kullanabilirsiniz. Bunu yapmak için, şeması OPENXML tarafından satır kümesini oluşturmak için kullanılabilecek mevcut bir tablo adını belirtmeniz yeter.
Şema belirtmek için WITH yan tümcesini kullanma
Tam bir şema belirtmek için WITH Yan Tümcesini kullanabilirsiniz. Satır kümesi şemasını belirtirken sütun adlarını, veri türlerini ve XML belgesine eşlemelerini belirtirsiniz.
SchemaDeclaration içindeki ColPattern parametresini kullanarak sütun desenini belirtebilirsiniz. Belirtilen sütun deseni, satır kümesi sütununu rowpattern tarafından tanımlanan XML düğümüne eşlemek için kullanılır ve eşleme türünü belirlemek için de kullanılır.
ColPattern sütun için belirtilmezse, satır kümesinin sütunu, flags parametresi tarafından belirtilen eşlemeye bağlı olarak aynı ada sahip XML düğümüne eşlenir. Ancak, WITH yan tümcesinde şema belirtiminin bir parçası olarak ColPattern belirtilirse, flags parametresinde belirtilen eşlemeyi geçersiz kılar.
Satır kümesi sütunlarıyla XML düğümleri arasında eşleme
OPENXML deyiminde, isteğe bağlı olarak rowpattern tarafından tanımlanan XML düğümleri ve satır kümesi sütunları arasında öznitelik merkezli veya öğe merkezli olabilecek eşleme türünü belirtebilirsiniz. Bu bilgiler, XML düğümleri ile satır kümesi sütunları arasındaki dönüştürmede kullanılır.
Eşlemeyi iki şekilde belirtebilir ve her ikisini de belirtebilirsiniz:
flags parametresini kullanarak
flags parametresi tarafından belirtilen eşleme, XML düğümlerinin, aynı ada sahip karşılık gelen satır kümesi sütunlarıyla eşleştiği isim uyumunu varsayar.
ColPattern parametresini kullanarak
Bir XPath ifadesi olan ColPattern, WITH yan tümcesinde SchemaDeclaration'ın bir parçası olarak belirtilir. ColPattern'da belirtilen eşleme, flags parametresi tarafından belirtilen eşlemeyi geçersiz kılar.
ColPattern , bayraklarla belirtilen varsayılan eşlemenin üzerine yazan veya geliştiren öznitelik merkezli veya öğe merkezli gibi eşleme türünü belirtmek için kullanılabilir.
ColPattern aşağıdaki koşullarda belirtilir:
Satır kümesindeki sütun adı, eşlendiği öğe veya öznitelik adından farklıdır. Bu durumda ColPattern , satır kümesi sütununun eşlendiği XML öğesini ve öznitelik adını tanımlamak için kullanılır.
Meta özellik özniteliğini sütuna eşlemek istiyorsunuz. Bu durumda ColPattern , satır kümesi sütununun eşlendiği meta özelliği tanımlamak için kullanılır. Meta özellikleri kullanma hakkında daha fazla bilgi için bkz. OPENXML'de MetaÖzellikler Belirtme.
Hem bayraklar hem de ColPattern parametreleri isteğe bağlıdır. Eşleme belirtilmezse öznitelik odaklı eşleme varsayılır. Öznitelik merkezli eşleme , flags parametresinin varsayılan değeridir.
Öznitelik odaklı eşleme
OPENXML'de flags parametresinin 1 (XML_ATTRIBUTES) olarak ayarlanması öznitelik merkezli eşlemeyi belirtir. Bayraklar XML_ ÖZNITELIKler içeriyorsa, kullanıma sunulan satır kümesi her XML öğesinin satır olarak temsil edildiği satırları sağlar veya tüketir. XML öznitelikleri, isim benzerliğine bağlı olarak, SchemaDeclaration'da tanımlanan veya WITH yan tümcesindeki TableName tarafından sağlanan özniteliklere eşlenir. İsim eşleşmesi, belirli bir adın XML özniteliklerinin satır kümesindeki aynı ada sahip bir sütunda depolandığı anlamına gelir.
Sütun adı eşlenen öznitelik adından farklıysa , ColPattern belirtilmelidir.
XML özniteliğinin bir ad alanı niteleyicisi varsa, satır kümesindeki sütun adının da niteleyicisi olmalıdır.
Öğe odaklı eşleme
OPENXML'de flags parametresinin 2 (XML_ELEMENTS) olarak ayarlanması , öğe merkezli eşlemeyi belirtir. Aşağıdaki farklar dışında öznitelik merkezli eşlemeye benzer:
Eşleme örneğinde, bir sütunun aynı ada sahip bir XML öğesine eşlenmesi, sütun düzeyinde bir desen belirtilmedikçe karmaşık olmayan alt öğeleri seçer. Alma işleminde, alt öğe ek alt öğeler içerdiğinden karmaşıksa sütun NULL olarak ayarlanır. Sonrasında alt öğelerin öznitelik değerleri yoksayılır.
Aynı ada sahip birden çok alt öğe için ilk düğüm döndürülür.
Ayrıca bakınız
- sp_xml_preparedocument (Transact-SQL)
- sp_xml_removedocument (Transact-SQL)
- OPENXML (Transact-SQL)
- XML Verileri (SQL Server)