Bildiginiz gibi XML dökümanlar ve XML türevleri artik her tür
uygulamalarda ister veribankasi ister veri iletisimi amaçli çok sık
kullanılmaktadır. Basit yapisi ve kullanisli olmasi XML’i bazi
durumlarda tercih sebebi yapabiliyor. Biz bu makalede SQL Server’daki
verilerimiz direk olarak XML formatinda nasil elde edebilecegimizi
inceleyecegiz.
Örnekte kullanacagimiz tablolari veritabaninizda olusturun ve verileriniz girin.
Tablolarin 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
]
Tablolarimiza verilerimizi girdikten sonra basit SQL sorgulariyla sonuçlari görelim.
SELECT
*
FROM
Urunler
FOR
xml auto
For xml komut ile sorgu sonuçumuzu xml olarak sql’den alabiliyor. Auto komutu iste XML semasinin otomatik belirlenmesina yariyor. Ilerki sorgularda biz bu semayi kendi istedigimiz sekilde degistirebilecegiz.
Yukardaki sorgunun çiktisi asagidaki sekilde olacaktir.
<
Urunlerid
=
"3"
katid
=
"2"
urunadi
=
"Bulasik Makinesi"
fiyat="750.0000
"
adet
=
"15"
sgiris
=
"2006-07-03T00:00:00"
/>
<
Urunlerid
=
"2"
katid
=
"2"
urunadi
=
"Buzdolabi"
fiyat
=
"1500.0000"
adet
=
"25"
sgiris
=
"2004-11-03T00:00:00"
/>
<
Urunlerid
=
"8"
katid
=
"3"
urunadi
=
"DVD Player"
fiyat
=
"1500.0000"
adet
=
"60"
sgiris
=
"2002-02-02T00:00:00"
/>
<
Urunlerid
=
"1"
katid
=
"1"
urunadi
=
"Elektrikli Süpürge"
fiyat="500.0000
"
adet
=
"50"
sgiris
=
"2003-10-02T00:00:00"
/>
<
Urunlerid
=
"4"
katid
=
"4"
urunadi
=
"HardDisk"
fiyat="250.0000
"
adet
=
"5"
sgiris
=
"2001-06-03T00:00:00"
/>
<
Urunlerid
=
"5"
katid
=
"4"
urunadi
=
"LCD Monitor"
fiyat="150.0000
"
adet
=
"9"
sgiris
=
"2003-06-02T00:00:00"
/>
<
Urunlerid
=
"9"
katid
=
"3"
urunadi
=
"Müzik Seti"
fiyat="450.0000
"
adet
=
"15"
sgiris
=
"2008-06-03T00:00:00"
/>
<
Urunlerid
=
"6"
katid
=
"5"
urunadi
=
"Samsung Cep Telefonu"
fiyat="150.0000
"
adet
=
"2"
sgiris
=
"2007-06-03T00:00:00"
/>
<
Urunlerid
=
"7"
katid
=
"5"
urunadi
=
"Sony Cep Tel."
fiyat="225.0000
"
adet
=
"15"
sgiris
=
"2006-12-06T00:00:00"
/>
Gördügünüz gibi Urunler tagi açilmis ve gerekli attribute’ler tek tek eklenmis.Burada isterseniz tablo isminden farkli bir tag ismide verebiliriz.
Örnegin;
SELECT
*
FROM
Urunler
FOR
xml Raw(
'CebiUrunleri'
)
Sorgu sonucu aşağıdaki şekilde olacaktır.
<
CebiUrunleriid
=
"3"
katid
=
"2"
urunadi
=
"Bulasik Makinesi"
fiyat="750.0000
"
adet
=
"15"
sgiris
=
"2006-07-03T00:00:00"
/>
<
CebiUrunleriid
=
"2"
katid
=
"2"
urunadi
=
"Buzdolabi"
fiyat
=
"1500.0000"
adet
=
"25"
sgiris
=
"2004-11-03T00:00:00"
/>
<
CebiUrunleriid
=
"8"
katid
=
"3"
urunadi
=
"DVD Player"
fiyat
=
"1500.0000"
adet
=
"60"
sgiris
=
"2002-02-02T00:00:00"
/>
<
CebiUrunleriid
=
"1"
katid
=
"1"
urunadi
=
"Elektrikli Süpürge"
fiyat="500.0000
"
adet
=
"50"
sgiris
=
"2003-10-02T00:00:00"
/>
<
CebiUrunleriid
=
"4"
katid
=
"4"
urunadi
=
"HardDisk"
fiyat="250.0000
"
adet
=
"5"
sgiris
=
"2001-06-03T00:00:00"
/>
<
CebiUrunleriid
=
"5"
katid
=
"4"
urunadi
=
"LCD Monitor"
fiyat="150.0000
"
adet
=
"9"
sgiris
=
"2003-06-02T00:00:00"
/>
<
CebiUrunleriid
=
"9"
katid
=
"3"
urunadi
=
"Müzik Seti"
fiyat="450.0000
"
adet
=
"15"
sgiris
=
"2008-06-03T00:00:00"
/>
<
CebiUrunleriid
=
"6"
katid
=
"5"
urunadi
=
"Samsung Cep Telefonu"
fiyat="150.0000
"
adet
=
"2"
sgiris
=
"2007-06-03T00:00:00"
/>
<
CebiUrunleriid
=
"7"
katid
=
"5"
urunadi
=
"Sony Cep Tel."
fiyat="225.0000
"
adet
=
"15"
sgiris
=
"2006-12-06T00:00:00"
/>
Gördügünüz gibi Urunler yerine artik “raw” komutu ile sizin istediginiz tag ismi yazdirilmis oldu.
Sorgu sonucuna tekrar bakacak olursak tag isminden sonra her deger birer attribute olarak yazilmis. Eger dilerseniz bu özellikleri tek tek elementler olarakta yazdirabilirsiniz.
SELECT
*
FROM
Urunler
FOR
xml Raw(
'CebiUrunleri'
),elements
<
CebiUrunleri
>
<
id
>3</
id
>
<
katid
>2</
katid
>
<
urunadi
>Bulasik Makinesi</
urunadi
>
<
fiyat
>750.0000
</
fiyat
>
<
adet
>15</
adet
>
<
sgiris
>2006-07-03T00:00:00</
sgiris
>
</
CebiUrunleri
>
<
CebiUrunleri
>
<
id
>2</
id
>
<
katid
>2</
katid
>
<
urunadi
>Buzdolabi</
urunadi
>
<
fiyat
>1500.0000</
fiyat
>
<
adet
>25</
adet
>
<
sgiris
>2004-11-03T00:00:00</
sgiris
>
</
CebiUrunleri
>
<
CebiUrunleri
>
<
id
>8</
id
>
<
katid
>3</
katid
>
<
urunadi
>DVD Player</
urunadi
>
<
fiyat
>1500.0000</
fiyat
>
<
adet
>60</
adet
>
<
sgiris
>2002-02-02T00:00:00</
sgiris
>
</
CebiUrunleri
>
..
..
Artik tablomuzdaki kolon degerleri Ana tag ismi altinda birer element olarak gelmis oldu. Siz projelerinizde istediginiz formati kullanabiliriniz.
SQL ile daha gelismis XML semalari olusturmakta mümkün. Bunun için for xml komutu ile beraber explicit komutu kullanmaniz gerekecektir. Örnegin Ana tagimiz kategori isimleri olsun ve altinda Ürünler tagi ve elementler halinde bu kategoriye ait ürün isimleri ve diger ö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
<
KategorilerKategoriAdi
=
"Beyaz Esya"
>
<
URUNAdi
=
"Bulasik Makinesi"
Adet
=
"15"
StokGirisTarihi
=
"2006-07-03T00:00:00"
/>
<
URUNAdi
=
"Buzdolabi"
Adet
=
"25"
StokGirisTarihi
=
"2004-11-03T00:00:00"
/>
</
Kategoriler
>
<
KategorilerKategoriAdi
=
"Bilgisayar"
>
<
URUNAdi
=
"HardDisk"
Adet
=
"5"
StokGirisTarihi
=
"2001-06-03T00:00:00"
/>
<
URUNAdi
=
"LCD Monitor"
Adet
=
"9"
StokGirisTarihi
=
"2003-06-02T00:00:00"
/>
</
Kategoriler
>
<
KategorilerKategoriAdi
=
"Cep Telefonlari"
>
<
URUNAdi
=
"Samsung Cep Telefonu"
Adet
=
"2"
StokGirisTarihi
=
"2007-06-03T00:00:00"
/>
<
URUNAdi
=
"Sony Cep Tel."
Adet
=
"15"
StokGirisTarihi
=
"2006-12-06T00:00:00"
/>
</
Kategoriler
>
<
KategorilerKategoriAdi
=
"Elektronik"
>
<
URUNAdi
=
"DVD Player"
Adet
=
"60"
StokGirisTarihi
=
"2002-02-02T00:00:00"
/>
<
URUNAdi
=
"Müzik Seti"
Adet
=
"15"
StokGirisTarihi
=
"2008-06-03T00:00:00"
/>
</
Kategoriler
>
<
KategorilerKategoriAdi
=
"Ev Aletleri"
>
<
URUNAdi
=
"Elektrikli Süpürge"
Adet
=
"50"
StokGirisTarihi
=
"2003-10-02T00:00:00"
/>
</
Kategoriler
>
Bu sorguda “explicit” komutu kullandigimiz için semayi kendimiz belirmemiz gerekiyor. “UNION” ile birlestirdigimiz sorgulara bakin.2 sorguda Tag ve Parent kolonlari ile basliyor. Eger explicit komutu kullandiysaniz sorgularinizin ilk 2 kolonu bu sekilde olmalidir. Tag kolonu XML içerisindeki elementlere unique tag numarasi vermis oluyoruz.Parent ile ise o elementin hangi element içerinde oldugunuz belirtmis oluyur. Burada dikkat etmeniz bir baska konu ise kolonlara verdigimiz isimler.
[ElementAdi!ParentTagIDSi!TagAttribute] kolon isimleri bu sekilde verilmedir. Dikkat edin ilk sorgumuzda [Kategoriler!1!KategoriAdi] sekliden kolon ismi kullandik.Kategoriler element adini,1 hangi elementin içinde oldugunu KategoriAdi ise Kategoriler elementinin özelliginiz belirtiyor. Ayni sey diger kolonlar içinde geçerli.Tabi bu kolonlarin degerleri 2. Sorguda geliyor.
Eger URUN elementine ait özelliklerinde alt element olarak gelmesini istersek sorgumuz asagidaki gibi degistirmemiz 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
<
KategorilerKategoriAdi
=
"Beyaz Esya"
>
<
URUN
>
<
Adi
>Bulasik Makinesi</
Adi
>
<
Adet
>15</
Adet
>
<
StokGirisTarihi
>2006-07-03T00:00:00</
StokGirisTarihi
>
</
URUN
>
<
URUN
>
<
Adi
>Buzdolabi</
Adi
>
<
Adet
>25</
Adet
>
<
StokGirisTarihi
>2004-11-03T00:00:00</
StokGirisTarihi
>
</
URUN
>
</
Kategoriler
>
<
KategorilerKategoriAdi
=
"Bilgisayar"
>
<
URUN
>
<
Adi
>HardDisk</
Adi
>
<
Adet
>5</
Adet
>
<
StokGirisTarihi
>2001-06-03T00:00:00</
StokGirisTarihi
>
</
URUN
>
<
URUN
>
<
Adi
>LCD Monitor</
Adi
>
<
Adet
>9</
Adet
>
<
StokGirisTarihi
>2003-06-02T00:00:00</
StokGirisTarihi
>
</
URUN
>
</
Kategoriler
>
...
...
URUN!2!Adi!ELEMENT burada element direktif i vereken özellikleri birer element olarak göstermis olduk.