Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Yaşar Gözüdeli
Yaşar Gözüdeli
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
10 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: aldigi birlikte erisim esdeger ifadeleri ifadesi return select server skaler tbkitap verinin xml’in xquery xquery ADO.NET/SQL Yaşar Gözüdeli
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : ADO.NET/SQL
Yayınlanma Tarihi : 22.11.2004
Okunma Sayısı : 27912
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 28.3.2024
Turhal Temizer
Mac OS/X Removing CUDA 28.3.2024
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 28.3.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 28.3.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
SQL Server 2005'te XML Veri ile Çalışmak-1
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
SQL Server 2005 XML’i skaler bir tip olarak getirmenin yanı sıra, bu tipi sorgulamak üzere bir de dile de destek sunmaktadır: XQuery. XQuery, W3C tarafından henüz üstünde standartlaştırma çalışmaları devam eden bir dil. Bu makalede, XML tipli bir sütunda XQuery sorgulama da dahil olmak üzere yapılabilecek işlemlerin bir özeti verilmeye çalışılmıştır. Örnek kodlar, SQL Server 2005 Beta-2 sürümü üstünde test edilmiştir.

Giriş

SQL Server 2005 XML konusunda büyük yeniliklerle gelmekte. Bunlardan biri de XML’i bir skaler veri tipi olarak desteklemesi. Skaler olarak desteklenen bu veri tipini sorgulamak için XQuery kullanılıyor. Bu nedenle ilk olarak XQuery hakkında fikir sahibi olacağız. Sorgulama dışındaki güncelleme, ekleme ve silme gibi konularda SQL Server 2005’in XML tipine eklediği fonksiyon(method)’lar ve bu fonksiyonların aldığı çeşitli ifadelerle gerçekleştirmekte. Ancak bu işlemleri, bir başka makalede ele almak üzere şimdilik yer vermeyeceğiz.

XQuery

XQuery XML veriyi sorgulamak için kullanılan bir sorgu dilididir. Henüz standart olarak kabul edilmemiş olsa da W3C’nin konu üstündeki çalışmaları devam etmektedir ve Çalışma Taslağı("Working Draft" deyiminin W3C için bir standart’ın geliştirmesindeki bir ön aşamadır ve bu nedenle özel bir anlamı vardır.) aşamasındaki bu dil hakkındaki en güncel bilgileri www.w3c.org/TR/xquery adresinden alabilirsiniz.

(X’ten içiniz almıyorsa bu paragrafı geçebilirsiniz.)Bugüne kadar XML’in veri taşıma için tanımlanmış bir işaret dili olduğunu bir çok yerde duymuş-okumuş olabilirsiniz. Ama yer yer XML’i XSL’le dönüştürme ihtiyacı nedeniyle XSLT gibi bir dil kullanılır. XPath, bu işlemde XSLT’ye düğüm seçme gibi XML veriye erişim hususunda temel sağlayan bir alt dildir. XQuery’nin bir standart olma konusunda geç kalmasının belki en büyük nedenlerinden biri, XML’in bir depolama standardı olarak geliştirilmemiş olması. Ama XML’in hızlı çıkışı, her ne kadar XML veri saklamak için geliştirilmemiş olsa da veri saklamada kullanılan bir yapı halini alıvermesine neden oldu. Haliyle, yeni bir X alt dili daha doğmak üzere, XQuery. XQuery, SQL’e göre daha kısıtlı bir dil olsa da, SQL’de yer alan DML(Veri İşleme Dili) ifadelerinden SELECT’e eşdeğer bir dil olduğunu söyleyebiliriz. Tek farkları, SELECT ifadesi ile tablo ve sütunlarda saklanan ilişkisel veri sorgulanırken, XQuery ifadeleri ile de XML formatında saklanmış veriler sorgulanabilmekte.

XQuery, XML’in bir alt ailesi olduğu için büyük-küçük harf duyarlı bir dil ve ayrılmış kelimelerinin tamamı küçük harfli. XQuery ifadeleri genel olarak bir takdim(prolog) ile başlar. Şu şekilde açıklamalar eklenebilir:

(: XQuery ile XML veri Sorgulanır :)
Nasıl ki SELECT ifadesi ile birlikte çeşitli fonksiyonlar kullanabiliyoruz, XQuery ifadeleri ile birlikte de hazır fonksiyonlar kullanılabilir ve ihtiyaç varsa, yeni fonksiyonlar oluşturulabilir. XQuery, size ilk bakışda bir işaretleme dili türevi gibi gelebilir ama görünüşe aldanmayın. XQuery ile değişken tanımlanabilir ve SQL’deki atama işlemine eşdeğer olarak, eğişkenlere değer atanabilir. FLWOR kısaltması XQuery’nin kalbini oluşturan 5 harflik kısaltma olup sırayla F:Döngü (For), L:Atama(Let), W:Kriter(WHERE), O:Sıralama(ORDER BY) ve R:Sonuç Döndürme(Return) işlevlerini yerine getiren deyimlerin ilk harflerinden oluşmuştur. Bu işlemlerin yapılabildiği yere de XQuery Deyim Gövdesi(Expression Body) adı verilmektedir. Bir "merhaba dünya" ifadesini seçmek istersek( SQL’deki SELECT ’merhaba dünya’ eşdeğeri)

let $msg := ’merhaba dünya’
return $msg

Bu kısa özetten sonra ilk fonksiyonumuzdan başlayarak XQuery hakkında kısa bir fikir edinme turuna çıkalım:

Bir XQuery ifadesine öncelikle bir girdi olması gerekir. Bunun için fn:doc() ’u kullanacağız. doc() fonksiyonu ile bir XML veri kaynağına erişim sağlanır ve basitçe bir XML veri dosyasına erişim için şu şekilde kullanılır: doc(" xmldosya_ismi.xml ") . Ardından açılan doküman üstündeki düğümlere XPath’deki kullanımına eşdeğer olarak, listelenecek düğümlerin yolu verilir.

Örneğin şu şekilde makale.xml adında bir dosyada XML verimiz olsun:

kitaplar.xml Bu XML’deki kitap başlıklarını seçmek için, şu ifadeyi kullanabiliriz:

doc("kitaplar.xml")/kitaplar/kitap/isim
Bu ifade şu sonucu verecektir:

<isim> Visual Basic.NET </isim>
<isim> Telkin ve Hipnumaraz ile ögrenme Teknikleri</isim >
<isim> Yatirim Plani Yapma </isim>
<isim> Is Basinda Duygusal Zeka </isim>
<isim> Is Hayatinda Motivasyon </isim>
<isim> Hayat Yolunda zorluklarla Mücadele</isim>
Bu ifadeden elde edilen sonuçta bir kısıtlama yapılabilir. Bunun için, XPath takdim ifadesinin sonuna filtre yüklemleri(predicate) eklenebilir veya birazdan detaylandıracağımız FLWOR deyimindeki WHERE ifadesinden faydalanılabilir.

doc("kitaplar.xml")/kitaplar/kitap[@ numara >"4"]/isim
ifadesinin döndüreceği sonuç,

<isim> Is Hayatinda Motivasyon </isim>
<isim> Hayat Yolunda zorluklarla Mücadele </isim>
şeklindedir.

Burada, sadece XPath2.0 ’dan ibaret bir XQuery takdimi kullandık ve bu takdim’de bir öznitelik değerini kriter olarak verdik. Şimdi bu sorguyu bir adım daha ileriye götürelim ve öznitelikle birlikte bir de düğüm değerini sorgulayalım: sayfa sayıları 200’den ve numarası 2’den büyük kitapların listesini almak istersek:

doc("kitaplar.xml")/kitaplar/kitap[@numara>1 and sayfaSayisi>200]
Aynı sonucu WFLOR ile ile de elde edebiliriz, WFLOR ifadelerinin daha farklı bir elimine yöntemi kullanıldığına dikkat edin. Her bir eleman tek tek ele alınır ve sonuca yansıtılır veya yansıtılmaz. Bu haliyle, ilişkisel veritabanında kayıtlara satır satır erişim sağlayan Cursor’lere eşdeğer olarak görülebilir. Bir önceki örneğimizi bir WFLOR ifadesi ile elde edelim:

for $k in doc("kitaplar.xml")/kitaplar/kitap[@ numara >"1"]/
let $s := $k/sayfaSayisi
where $s > 200
order by $k/isim descending
return $k/ISBN

Xpath FLWOR

SQL’deki SELECT
Sorgu ifadesi Karşılığı


RETURN

SELECT

FOR

FROM

LET*

SET

WHERE

WHERE

ORDER BY

ORDER BY

doc("....").... [ ... ] **

WHERE

* SQL Server 2005’in şuanki sürümlerince desteklenmemektedir.
**XML doküman düğümlerine erişimi tayin eden for() fonksiyonundan sonra verilen şartlarla da neticede yer alacak düğümleri filitrelemek mümkündür. Bu nedenle, SQL’deki WHERE ifadesine bu işlem de karşılık olarak gösterilebilir.

SQL Server 2005’de XML Veritipi ve Fonksiyonları

Buraya kadar, XQuery hakkında bir fikir edinmeye çalıştık. Takip eden kısımda, buraya kadar elde ettiğimiz fikirlerden hareketle, SQL Server’in yeni sürümünün bize XML veri tipi üstünde sağladığı imkanlara bir gözatacağız.

Öncelikle test adında bir veritabanı oluşturalım. Ardından bu veritabanında, sadeceXML veri tipini test etmek için, yukarıdaki kitaplar.xml’i de tutacağımız bir tbKitap adında tablo tanımlayalım. Bu tanımlamada, kitaplara ait başka bilgiler için de sütunlar açılabilir.

CREATE DATABASE test
go
CREATE TABLE tbKitap (
kitapKOD INT IDENTITY,
kitapIcerdeMi BIT,
kitapBilgileri XML)
Öncelikle test adında bir veritabanı oluşturalım. Ardından bu veritabanında, sadece bir tane kayıt olarak yukarıdaki XML verisini ekleyelim:



xml.query(string XQuery)

XML tipli alanların bir methodu olan query, string tipinde dışarıdan aldığı XQuery ifadesini çalıştırarak düğüm varsa düğümü, yoksa boş sonucunu döndürür. XQuery ifadesi çok komlike bir ifade olabileceği gibi, basit bir XPath ifadesi de olabilir. Burada dikkat edilmesi gereli husus, XQuery’de veriyi doc() veya collection() gibi fonksiyonlarla bir dosyadan yahutta bir değişkenden(akıntı halindeki XML) okurken, xml veritipi nüshasının bir methodu olan query() zaten belli bir sütundaki veriye işaret ettiği için, saydığımız bu iki fonksiyonun yerine geçmektedir.

İlk XQuery sorgumuzun bir benzeri ile her bir kitabın sayfa sayısını xml olarak görüntüleyelim:



SELECT kitapBilgileri.query(’kitaplar/kitap/sayfaSayisi’) as
SayfaSayisiXML
FROM tbKitap
şu neticeyi verecektir:

<sayfaSayisi>204</sayfaSayisi>
<sayfaSayisi>274</sayfaSayisi>
<sayfaSayisi>74</sayfaSayisi>
<sayfaSayisi>447</sayfaSayisi>
<sayfaSayisi>140</sayfaSayisi>
<sayfaSayisi>119</sayfaSayisi>
sonucunu elde ederiz.

Biraz daha komplike bir sorgu olarak, adının içerisinde "telkin" geçen kitapların adını görmemiz gerekirse:

SELECT kitapBilgileri.query ( ’
for $b in kitaplar/kitap/isim
where contains($b,"Telkin")
return $b ’ ) as TelkinliKitap
FROM tbKitap


DİKKAT:

SQL Server 2005’in şu anki sürümleri let ifadesini desteklememektedir.

WFLOR ifadeleri, XML verinin yeniden şekillendirilmesinde de kullanılabilir. Örneğin, kitapların öznitelik olarak tutulan <kitap numara="x"... şeklindeki kodlarını, <numara>x</numara> şeklinde döndürelim:

SELECT kitapBilgileri.query(’ for $b in kitaplar/kitap
return <numara>{
         string($b/@numara)
       } </numara> ’ ) as numaraXML
FROM tbKitap


xml.exist(string XQuery)

Dışarıdan aldığı bir XQuery düğüm seçme ifadenin, bir XML düğümüne tekabül etmesi halinde true(1) veya hiç düğüme rastlanmazsa false(0) değeri döndürür.

Örneğin sayfa sayısı 200’den büyük kitap var mı diye bakmak istersek:

SELECT kitapBilgileri.exist (’/kitaplar/kitap[sayfaSayisi>200]’ )
FROM tbKitap


Neticenin, bir XML düğümü değil, skaler bir sonuç olduğuna dikkat edin. Bu sonuç, her bir satır için tek değer döndürebilir. XML alan içerisindeki her bir düğüm için ayrı bir skaler değer döndürmez.

xml.value(string XQuery, string SQLVeriTipi)

Dışarıdan aldığı bir XQuery’nin sonunucu, bir SQL Server ortamı veri tipine döndürerek skaler bir sonuç döndürür. Ancak bazı kısıtları vardır. Bunları birazdan ele alacağız.

Örnek:

Her bir kitabın ISBN’lerini bir VARCHAR sonuçta döndürelim:

SELECT kitapBilgileri.value(’/kitaplar/kitap[1]/ISBN[1]’ , ’VARCHAR(16)’)
FROM tbKitap


Burada [1] ifadeleri olmadığı sürece hata oluşur. Çünkü value ifadesinin aynı anda bir tek değer test etme şansı vardır. Birden fazla değer, skaler bir tek veriye dönüştürülemez. Bu nedenle value ile dönüştürülecek XML verinin her bir satır için bir tek kontrol yapılabilir.

DİKKAT:

Buradaki [1] ifadesi, ilk düğümdeki değerlerin dikkate alınacağını, takip eden düğümlerin dikkate alınmayacağı anlamında bir XPath ifadesidir. SQL Server’deki TOP n deyimine benzetebiliriz.

Örneğin, daha önce kullandığımız tablomuza yeni bir satır eklersek:

INSERT INTO tbKitap
VALUES
(
1 ,

<kitaplar>
<kitap numara="7">
<isim>
Is Hayatimdan Kesitler ve Gençlere Tavsiyler
</isim>
<ISBN>975-8243-92-6</ISBN>
<ozet>Üzeyir Garih’’in hayatindan kesitler</ozet>
<sayfaSayisi>214</sayfaSayisi>
</kitap>
</kitaplar>
’ )
Bir önceki örneğin yeni sonucu şu şekilde olacaktır:



xml.nodes(string XQuery)

nodes() methodunun kullanımı, buraya kadar gördüğümüz bütün methodlardan biraz daha karmaşık. Dışarıdan aldığı bir XQuery sorgusu ile, yeni bir XML düğümü oluşturur. Ancak bu XML doğrudan kullanılamaz. Ancak bir CROSS APPLY veya OUTER APPLY ile birlikte kullanılabilir.

Öncelikle bütünü içine alan bir örneğe göz atarsak, ardından işlevin kavranması kolaylaşacaktır:

Örnek:

Yukarıdaki işlemlerle eklediğimiz kitapları, XML formatından çıkartıp, bir tablodan sorgu alıyormuş gibi tabular veri olarak döndürmek istediğimizi düşünelim:

SELECT kitapKOD as PartiNo ,
a.value (’@numara[1]’ , ’integer’ ) as kitapNo ,
a.value (’isim[1]’ , ’varchar(50)’ ) as KitapAdlari ,
a.value (’sayfaSayisi[1]’ , ’ int ’ ) as SayfaSayisi
FROM tbKitap
OUTER APPLY kitapBilgileri.nodes( ’kitaplar/kitap’) as result (a)


Buradaki noktaları birer birer anlamaya çalışalım:

  • OUTER APPLY ’i takip eden kitapBilgileri.nodes(....) ifadesinde geçen kitapBilgileri XML sütunu, FROM’dan önce gelen tbKitap tablosunda yer almaktadır.
  • result(XX) şeklinde düğüme bir takma ad(alias) verilebilir. Örneğimizde result(a) şeklinde kullandık.
  • Düğüm, SELECT ifadesinden sonra bu takma ad ile çağrılıp, xml.value() ve diğer XML sütun methodları ile bir daha sorguya tabi tutulabilir.
  • SELECT ifadesi, düğümün dışında, doğrudan tablodan gelen değerleri kapsayabilir.
  • OUTER APPLY ile CROSS APPLY , Transact-SQL’in yeni sürümünde yer alan iki yeni operatör olup, XML veri tipli sütunların dışında, tablo gibi davranan sonuçlar döndüren(rowset) fonksiyonlarla da işlevleri olan operatörlerdir. arasındaki fark, CROSS APPLY sadece eşleşen kayıtları getirirken, OUTER APPLY, karşılık bir değer bulamasa bile, satır bulduğu sürece NULL değer gösterir.
Örnek:

Şu şekilde, XML verisi boş olan bir satır ekleyelim:

INSERT INTO tbKitap
VALUES
(
1 , ’
<kitaplar>
</kitaplar>
’ )
ve daha sonra, sadece son kaydın neticede yer alması için bir WHERE şartı ekleyerek, sorgunun sonucuna bakalım:



Değerlendirme ve Sonuç

SQL Server 2005, XML ve ilişkilsel veriyi içiçe kullanma konusunda çok gelişmiş seçenekler sunmaktadır. Burada, sadece XML verinin sorgulanması ele alınmıştır. Bunun dışında, XML verinin bazı parçalarının, satırda güncelleme yapmadan doğrudan değiştirilmesi gibi konulara da destek vermektedir. Bu konu ve ilişkisel verinin hiyerarşik veri ile (Tabular Data-XML Data) iç içe bulunduğu veritabanlarında tasarım sırasında nelere dikkat edilmesi gerektiği başka bir makalede ele alınacaktır.


Örneklerde kullanılan T-SQL ifadeleri
Makale:
SQL Server 2005'te XML Veri ile Çalışmak-1 ADO.NET ve SQL Yaşar Gözüdeli
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor