Makale Özeti

Bu yazımızda SQL deki OpenXml fonksiyonunu kullanarak bir XML dökümanını SQL server a almayı öğreneceğiz.

Makale

Merhabalar,

Bu yazımda , bir XML dökümanını , SQL Server 2000 veritabanı içinde bulunan bir tabloya nasıl insert edileceğini anlatacağım. Bilindiği üzere, XML data formatı, son yıllarda programlama dünyasının olmazsa olması haline dönüşürken, bu kadar geniş bir kabul gören bu formatla çalışmak ve onu mümkün olduğunca kolay bir şekilde proses etmek ise bizim görevimiz oldu. J


Bu amaç doğrultusunda, bu yazıda OPENXML yapısını tanıyacağız, yani bir XML dökümanını veritabanına alacağız.Peki nasıl?


Adımlar:

1- Öncelikle XML dökümanı kullanılmak üzere bir değişkene bindirilir ve hafızada bir DOM tree(Document Object Model) haline dönüştürülür (sp_xml_preparedocument ile). Bu işlem genelde bir stored procedure içinde yapılır.

CREATE PROC ProcessOrder @doc NText

AS

DECLARE @idoc integer

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

........


Yukarıdaki örnekte @doc parametresine XML dökümanı verilir ve @idoc ile DOM tree’ si oluşturulur.


2-Daha sonra XML dökümanı OPENXML yapısıyla proses edilir.


OPENXML( idoc , rowpattern [, flags ])

[WITH ( SchemaDeclaration) | TableName ]



OPENXML parametreleri


Parametre Açıklama

rowpattern Dönecek node ların Xpath sorgusuyla belirlenmesi

idoc sp_xml_preparedocument prosedürüyle bir önceki adımda hazırlanan DOM tree

flags Attribute yada element merkezli oluşu belirleyen parametre

0-varsayılan (attribute), 1-attribute , 2-elements, 3-attribute ve elements

SchemaDeclaration Dönecek satırların kolonlarını belirleyen şema

TableName Var olan bir tablo adı (kolon yapısı XML den dönen kolon yapısıyla uyuşmalı)



Örneğin ;

.......

SELECT * FROM OPENXML(@idoc, order/lineitem, 1)

WITH (productid integer,

price money)

……


Yukarıdaki yapı, aşağıdaki XML için kullanılır ve lineitem elementlerine konumlanarak aşağıdaki tabloyu oluşturur.


<order orderno="1001" orderdate="01/01/2001" custid="1235">

<lineitem productid="14" quantity="2" price="15.99"/>

<lineitem productid="17" quantity="1" price="5.49"/>

<lineitem productid="21" quantity="2" price="14.99"/>

</order>


productid price

14 15.99

17 5.49

21 14.99


3- Daha sonra bu kayıt kümesi ya varolan bir tabloya insert edilir veya yeni bir tablo yaratılarak veri içine konur.


Varolan tablo:


INSERT Price

SELECT * FROM OPENXML(@idoc, order/lineitem, 1)

WITH (productid integer,

price money)



Tablo yaratmak:


 

Select into newPrice from

FROM OPENXML(@idoc, order/lineitem, 1)

WITH (productid integer,

price money)



4-Son olarak DOM tree hafızadan alınmalıdır:


EXEC sp_xml_removedocument @idoc


Sonuç olarak, prosedurun tamamı şu şekilde olmalıdır:

CREATE PROC ProcessPrice @doc NText

AS

DECLARE @idoc integer

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

Select into newPrice from

FROM OPENXML(@idoc, order/lineitem, 1)

WITH (productid integer,

price money)

 

EXEC sp_xml_removedocument @idoc

Xpath sorgulama ile XML datasının filtrelenmesi de mümkündür.


Örneğin;


SELECT *

FROM OPENXML(@idoc, order/lineitem[@quantity>2] , 1)

WITH (productid integer,

quantity integer,

price money)

 

 

Hepinize kolay gelsin.