Ana içeriğe atla

"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 :)



Bu blogdaki popüler yayınlar

SQL DATEADD() Fonksiyonu(Sql de tarihe ay,gün,yıl ekleme)

Kullanım Kalıbı : DATEADD (datepart , number , date ) . datepart ksımına month,year,day vs artırmak istediğimiz tarih birimini yazıyoruz. . number ksımına arttırmak istediğimiz miktarı yazıyoruz. . date kısmına da hangi tarih e ekleneceğini belirtiyoruz. Örnek olarak şu an ki tarihten 1 ay sonrasını görmek için : Şu anki tarih '10-1-2011' olsun(gün,ay,yıl) Sorgu : SELECT DATEADD(MONTH,+1,GETDATE()) Çıktı alacağımız tarih : '10-2-2011' şekinde olacaktır.

Sql IDENTITY_INSERT Kullanımı

Sql de bazen veri taşıma veya benzeri bir durumda aktarmak istediğimiz tablo kayıtlarını identity field olan ID leri ile aktarmak isteriz.Fakat sql server buna izin vermez.Bu Identity alana insert işlemi için aşşağıdaki gibi bir işlem uygulayabiliriz. Örnek Olarak aşşağıdaki sorguda eski tablomuza yeni başka bir tablo kayıtlarını aynen aktarıyoruz. SET IDENTITY_INSERT tabloadı ON -- identity insert yapılabilir konuma geliyor INSERT INTO eskiTablo SELECT * FROM yeniTablo SET IDENTITY_INSERT tabloadı OFF -- identity insert yapılamaz konumuna geliyor

Netsis NetOpenX50 Nesnesini C# Visual Studio Üzerinde Çalıştırma

Netsis ile sipariş, ürün, fiyat, stok entegrasyonları yaparken NetOpenX apisini kullanmamız gerekiyor. Netsis kullanan bir firma ile entegrasyon geliştirmeden önce yapmamız gereken şey firmanın netopenx api lisansı alıp almadığını öğrenmeliyiz.Bunu onaylattıktan sonra Visual Studio projemize NetOpenx50 dosyasını referans olarak eklemek kalıyor. Projemize referans eklemek için öncelikle NetOpenX50.dll ini bilgisayarımıza indiriyoruz.Ardından komut sataırına girerek aşağıdaki komutu vermeliyiz. regsvr32 C:\Netsis\NetOpenX50.dll Bu işlem sonrasında NetOpenX50 dosyamızı com objesi olarak işletim sistemimize kayıt etmiş oluyoruz. Hemen ardından visual studio projemizi açarak projenin üzerinde References kısmına sağ tuş tıklayarak yeni referens ekle diyoruz.Ardından çıkan pencereden sol panelden COM objelerini seçiyoruz ve orada "NetOpenX50 Kütüphanesi" alanı zaten çıkıyor ve direk seçip referans olarak projemize ekleyebiliyoruz. NetOpenX50 apisinin kullanımı için her d...