Kurumsal Otomasyon Çözümlerinde Zirve

SQLXML-Sql Sorgularıyla XML

Bildiğiniz gibi XML dökumanlar ve XML türevleri artık her tür uygulamalarda ister veribankası ister veri iletişimi amaçlı çok sık kullanılıyor. Basit yapısı ve kullanışlı olması XML’i bazı durumlarda tercih sebebi yapabiliyor. Biz bu makalede SQL Server’daki verilerimiz direk olarak XML formatında nasıl elde edebileceğimizi inceliyeceğiz.
Örnekte kullanacağımız tabloları veritabanınızda oluşturun ve verileriniz girin.
Tabloların SQL Scripti:
Kategoriler Tablosu:
CREATE TABLE [dbo].[Kategoriler](
[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[kategori] [varchar](50) COLLATE Turkish_CI_AS NOT NULL,
CONSTRAINT [PK_Kategoriler] PRIMARY KEY CLUSTERED
(
[kategori] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Urunler Tablosu:
CREATE TABLE [dbo].[Urunler](
[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[katid] [numeric](18, 0) NULL,
[urunadi] [varchar](50) COLLATE Turkish_CI_AS NOT NULL,
[fiyat] [money] NULL,
[adet] [int] NULL,
[sgiris] [smalldatetime] NULL,
CONSTRAINT [PK_Urunler] PRIMARY KEY CLUSTERED
(
[urunadi] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Tablolarımıza verilerimiz girdikten sonra basit SQL sorgularıyla sonuçları görelim.
SELECT * FROM Urunler FOR xml auto
For xml komut ile sorgu sonuçumuzu xml olarak sql’den alabiliyor. Auto komutu iste XML şemasının otomatik belirlenmesina yarıyor. İlerki sorgularda biz bu şemayı kendi istediğimiz şekilde değiştirebileceğiz.
Yukardaki sorgunun çıktısı aşağıdaki şekilde olacaktır.








Gördüğünüz gibi Urunler tagı açılmış ve gerekli attribute’ler tek tek eklenmiş.Burada isterseniz tablo isminden farklı bir tag ismide verebiliriz.Örneğin;
SELECT * FROM Urunler FOR xml Raw(‘SNNUrunleri’)
Sorgu sonucu aşağıdaki şekilde olacaktır.









Gördüğünüz gibi Urunler yerine artık “raw” komutu ile sizin istediğiniz tag ismi yazdırılmış oldu.
Sorgu sonucuna tekrar bakacak olursak tag isminden sonra her değer birer attribute olarak yazılmış. Eğer dilerseniz bu özellikleri tek tek elementler olarakta yazdırabilirsiniz.
SELECT * FROM Urunler FOR xml Raw(‘SNNUrunleri’),elements


3
2
Bulaşık Makinesi
750.0000
15
2006-07-03T00:00:00


2
2
Buzdolabı
1500.0000
25
2004-11-03T00:00:00


8
3
DVD Player
1500.0000
60
2002-02-02T00:00:00

..
..
Artık tablomuzdaki kolon değerleri Ana tag ismi altında birer element olarak gelmiş oldu. Siz projelerinizde istediğiniz formatı kullanabiliriniz.
SQL ile daha gelişmiş XML şemaları oluşturmakta mümkün. Bunun için for xml komutu ile beraber explicit komutu kullanmanız gerekecektir. Örneğin Ana tagımız kategori isimleri olsun ve altında Ürünler tagı ve elementler halinde bu kategoriye ait ürün isimleri ve diğer özellikleri gelsin.
SELECT distinct 1 AS Tag,NULL AS Parent,k.kategori AS [Kategoriler!1!KategoriAdi],
NULL AS [URUN!2!Adi],
NULL AS [URUN!2!Adet],
NULL AS [URUN!2!StokGirisTarihi] FROM Kategoriler k,Urunler u WHERE k.id=u.katid
UNION ALL
SELECT 2 AS Tag,1 AS Parent,k.kategori,u.urunadi,u.adet,u.sgiris FROM Kategoriler k,Urunler u
WHERE k.id=u.katid
ORDER BY [Kategoriler!1!KategoriAdi],[URUN!2!Adi],[URUN!2!Adet]
FOR xml explicit



















Bu sorguda “explicit” komutu kullandığımız için şemayı kendimiz belirmemiz gerekiyor. “UNION” ile birleştirdiğimiz sorgulara bakın.2 sorguda Tag ve Parent kolonları ile başlıyor. Eğer explicit komutu kullandıysanız sorgularınızın ilk 2 kolonu bu şekilde olmalıdır. Tag kolonu XML içerisindeki elementlere unique tag numarası vermiş oluyoruz.Parent ile ise o elementin hangi element içerinde olduğunuz belirtmiş oluyur. Burada dikkat etmeniz bir başka konu ise kolonlara verdiğimiz isimler.
[ElementAdı!ParentTagIDSi!TagAttribute] kolon isimleri bu şekilde verilmedir. Dikkat edin ilk sorgumuzda [Kategoriler!1!KategoriAdi] şekliden kolon ismi kullandık.Kategoriler element adını,1 hangi elementin içinde olduğunu KategoriAdi ise Kategoriler elementinin özelliğiniz belirtiyor. Aynı şey diğer kolonlar içinde geçerli.Tabi bu kolonların değerleri 2. Sorguda geliyor.
Eğer URUN elementine ait özelliklerinde alt element olarak gelmesini istersek sorgumuz aşağıdaki gibi değiştirmemiz gerekecek.

SELECT distinct 1 AS Tag,NULL AS Parent,k.kategori AS [Kategoriler!1!KategoriAdi],
NULL AS [URUN!2!Adi!ELEMENT],
NULL AS [URUN!2!Adet!ELEMENT],
NULL AS [URUN!2!StokGirisTarihi!ELEMENT] FROM Kategoriler k,Urunler u WHERE k.id=u.katid
UNION ALL
SELECT 2 AS Tag,1 AS Parent,k.kategori,u.urunadi,u.adet,u.sgiris FROM Kategoriler k,Urunler u
WHERE k.id=u.katid
ORDER BY [Kategoriler!1!KategoriAdi],[URUN!2!Adi!ELEMENT],[URUN!2!Adet!ELEMENT]
FOR xml explicit



Bulaşık Makinesi
15
2006-07-03T00:00:00


Buzdolabı
25
2004-11-03T00:00:00




HardDisk
5
2001-06-03T00:00:00


LCD Monitor
9
2003-06-02T00:00:00



URUN!2!Adi!ELEMENT burada element direktif i vereken özellikleri birer element olarak göstermiş olduk.

Yorum Yapılmamış

Bir cevap yazın