28 Şubat 2015 Cumartesi

"How to import XML data to Sql Server", Sql Server a XML ile veri aktarımı


Normal şartlarda Sql Server üzerindeki import seçenekleri arasında xml import olmadığı için bu işlemi biraz kodla halletmemiz gerekiyor.Bunun için izlememiz gereken adımlar aşağıdaki gibidir.

Bu işlemler için örnek olarak Product tablomuz olduğunu ve XML içerisinde ProductCode ve ProductName verileri olduğunu düşünelim.


Örnek XML Verimiz
<Products>   
    <Product>      
        <ProductCode>GFRT1001</ProductCode>      
        <ProductName>Ülker Çikolatlı Gofret</ProductName>
   </Product>
    <Product>     
        <ProductCode>GFRT1002</ProductCode>      
         <ProductName>Çokonat</ProductName>   
    </Product>
</Products>



1 - Öncelikle yapmamız gereken xml verisini sql de bir tabloda tutmak için bir tablo oluşturup, xml formatında verilerimizi bu tabloya aktarmak.

--Tablo oluşturuluyor.
CREATE TABLE ProductXML (IntCol int, XmlCol xml);

--Oluşturulan tabloya xml aktarılıyor.(sadece bir satır veri eklenecek ve bu işlem veri boyutu ile doğru orantılı olarak biraz uzun sürebilir)

INSERT INTO ProductXML (XmlCol)
SELECT * FROM OPENROWSET(
   BULK 'C:\XMLDataDirectory\products.xml',
   SINGLE_BLOB) AS x;


2- Sonrasında aşağıdaki kodlar ile ürün verilerimizi saklamak için gereken tabloyu oluşturuyor ve bu tabloya olması gereken formatta ürün verilerimizi aktarıyoruz.


--Product tablomuz oluşturuluyor.
CREATE TABLE Product(ProductCode nvarchar(50), ProductName nvarchar(250))


--XML dökümanı okunuyor ve Product tablosuna toplu olarak ekleniyor.

DECLARE @XML XML;
DECLARE @hDoc INT;


--XML değişkenine ProductXML tablosuna eklenen xml atanıyor.
SELECT @XML = XmlCol FROM ProductXML 

--Sql içerisindeki standart storedprocedure
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML


--Product tablosuna xml içerisindeki her Product elementi içerisindeki kod ve isim bilgileri ekleniyor.
INSERT INTO Product
SELECT ProductCode, ProductName FROM OPENXML(@hDoc, '/Products/Product')
WITH(
           ProductCode [nvarchar](50) 'Code',
           ProductName [nvarchar](250) 'Name'
         )
--Not : WITH kısmı içerisindeki elementler 'Name' şekllinde alınıyor, cümlelerin başına @ koyduğumuzda element yerine property verilerini alabilir alt elementlere ulaşmak için ise ../ kullanarak alt elementlerdeki veirilere ulaşabiliriz.


EXEC sp_xml_removedocument @hDoc

--Ve sonuç çıktımız

SELECT * FROM Product


ProductCode       ProductName
----------------       -------------------------
GFRT1001                 Ülker Çikolatlı Gofret
GFRT1002                 Çokonat



Karşılaşılabilecek hatalar : 

1. kısımda "You do not have permission to use the bulk load statement" hatasını alabilirsiniz.Bu durumda sql query penceresinde işlem yaptığınız kullanıcı ile ilgili bazı yetkilendirmeler yapmanız gerekiyor.Bunun için aşağıdaki aşamalar uygulanabilir.

1.Sql Server daki "Security" kısmını açarız.
2."Logins" bölümü açılır
3.İlgili kullanıcı için sağ tuş özellikler(Properties) tıklanır.
4.Sol bölümdeki "Roles" tabı açılır ve "bulkadmin" seçeneğine tıklanarak ilgili kullanıcı için bulk insert işlemine yetki verilir.
5.İşlem tamamdır :)



Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.