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