Makale Özeti

XML (Extensible Markup Language) dili yapısal bir veriyi tanımlama formatıdır. XML, HTML gibi sunulan veriyi handle edemez. Bunun yerine veriyi HTMLdeki gibi tagler içerisinde verir. Bu basit yapı bize programlar arası veri geçişlerini çok kolaylaştıran bir yapıdır. Bilindiği gibi Microsoft® SQL Server™ 2000 bize tam bir XML desteği sunmaktadır. Şimdi bu yazımda sizlere SQL Serveren XML desteği özelliklerinden bir kaçını ve SQL Serverin XML desteği için konfigürasyonun nasıl yapılacağını göstermeye çalışacağım.

Makale


SQL Cümleciği ile XML Nasıl Yaratılır?


T-SQL SELECT cümleciği içerisine FOR XML koşulu kullanarak sonucu XML formatlı almak mümkündür. FOR XMLkoşulunun kullanım modları şu şekildedir.


    FOR XML RAW :
        Sorgu sonucunda ki her bir satırının null olmayan kolonlarını row elmentinin bir niteliği(attribute) olarak sonuç verir.

    FOR XML AUTO :
        Sorgunun sonucunu SELECT cümleciği içerisinde ki FROM koşulundan sonra gelen tablo adları ana element ve kolonlarını ana elementin niteliği(attribute) şeklinde verir.

    FOR XML EXPLICIT:
        Dönenen XML sonuç-set(result set)'inin formatı konusunda kontrolün en çok bizde olduğu koşul modudur. Sorgu cümleciği dönecek olan XML dökümanın formatını içermelidir. Bu yüzden sorgu yazılırken iyi-formlanmış XML dokumanı olmalıdır.

Bu kadar açıklamalardan sonra uygulama yapıp sonuçları görelim.

XML Format'lı Sonuç Seti(Result Set) Oluşturmak için:
1. SQL Query Analyzer çalıştırın ve Northwind database'ine bağlanın.
2. Şu SQL cümleciğini yazıp F5 tuşuna basarak çalıştırın.
       
SELECT * FROM CUSTOMERS FOR XML RAW

SQL Server sonucu tek kolonda getirir ve bu kolonun adı da bir GUID(Globally Unique Identifier)'in parcası ile adlandırır. Bu sonuç iyi-formlanmış bir XML dokumanı değildir bunun için sonucun <root></root> tagı ile sarılmış olması gerekir. Buraya kadar anlatılanlar SQL Server'dan XML formunda datanın nasıl alınacağı konusundaidi. Şimdi ise bu XML datasının internet üzerinden nasıl yayınlanacağına bakalım.

İnternet Üzerinden XML Veriyi Nasıl Sunarız?

İnternet üzerinden SQL Server'a ulaşmadan önce XML sorgurlarını çalıştırabilmek için üzerinde IIS(Internet Information Services) calışan bir makinda sanal dizin(virtual directory) yaratıp ayarlarını yapmamız lazım. İsterseniz şimdi bunun nasıl yapılacağına bakalım ve birlikte yapmaya calışalım.

SQL Server XML Desteği için IIS Ayarları:

1. Start menüsünden Programs üzerine gelip, Microsoft SQL Servera tıkla, daha sonra Configure SQL XML Support in IIS programına tıkla.
2. Açılan pencereden server adının yanındaki (+) işaretine tıklayın. Default Web Site üzerine gelip farenin sağ tuşuna tıklayıp New  > Virtual Directory'ı seçin.
3. Açılan özellikler penceresinin General sekmesine gelip Virtual Directory Name alanına XMLTest,
4. Local Path yerine C:\Inetpub\wwwroot\xmltest yazın.
5. Daha sonra Security sekmesine gelip Northwind database'in Administratoru olan kullanıcının kullanıcı adını ve şifresini girin. (sa,sa)
6. Gene aynı pecerenin  Data Source sekmesine gelip SQL Server kısmına SQL server'ınızın adını yada IP adresini, Database kısmınada combodan Northwind'i seçin.
7. Settings sekmesinde Allow URL queries ve Allow template queries secneklerini seçin.
8. Virtual Names sekmesine gelip New butonuna tıklayın açılan pencerede Virtual Name kısmına template yazın Type olarak template seçin Path'ede C:\Inetpub\wwwroot\xmltest yazıp Ok butonuna basın.

Eğer bir uyarı mesajı alıyorsanız xmltest dizinin olmayışından kaynaklanıyordur C diskinde Inetpub\wwwroot dizini altına xmltest diye bir dizin yaratıp yeniden deneyin. ayarlarınız farklı ise örneğin Inetpub C diski yerine farklı bir disk adında ise yukarıda anlatılanları kendinize göre düzenleye bilirsiniz.

SQL Server'dan XML formatlı data almak:

SQL Serverdan XML formatında veriyi aşağıdaki yollardan alabilirsiniz.

  • Birinci yöntem: SQL Serve're sorgu cümleciğini bir HTTP isteği olarak gönderek ki bu cümlecik T-SQL cümleciği olabileceği gibi bir X-Path sorgulamasıda olabilir.
  •        

        Bu yöntemi kullanırken en önemli konu güvenlik ayarlarıdır. Eğer database'imizi public bir kullanıma açacaksak işlem yapılcak database üzerinde read-only hakka sahip bir kullanıcı kullanmakta fayda var.

     
  • İkinci yöntem: T-SQL cümleciği veya X-Path sorgu cümleciği içeren bir file yaratıp, sorgu sonucunda dönecek olan verinin formatı için bir de XML Template(.xsl) ekleyerek yapabiliriz. Bu yöntem SQL sorgu cümleciği kullanmaya göre daha kolay ve güvenli bir yöntemdir.

URL İçerisinde T-SQL kullanarak XML veri almak:

1. Internet Explorerı çalıştırın ve adres bara şunları yazın
    http://localhost/xmltest?sql=SELECT+contactname,
+phone+FROM+Customers+FOR+XML+raw&root=root

2. Adres cubuğunda sorguyu calıştırmak için ENTER tuşuna basın.

yukarıda yazılanları doğru olarak yaptıysanız aşağıda ki sonucu alıyor olmalısınız(valla ben yaptım oldu :)).

  <?xml version="1.0" encoding="utf-8" ?>
- <root>
  <row contactname="Maria Anders" phone="030-0074321" />
  <row contactname="Ana Trujillo" phone="(5) 555-4729" />
  <row contactname="Antonio Moreno" phone="(5) 555-3932" />
  <row contactname="Thomas Hardy" phone="(171) 555-7788" />
  <row contactname="Christina Berglund" phone="0921-12 34 65" />
  <row contactname="Hanna Moos" phone="0621-08460" />
  <row contactname="Frédérique Citeaux" phone="88.60.15.31" />
  <row contactname="Martín Sommer" phone="(91) 555 22 82" />
.....................
  </root>

contactname ve phoneleri  row elementinin birer niteli(attribute)ği olarak görüyoruz. Cünkü FOR XML koşulunu RAW özelliği ile kullandık. Şimdide JOIN koşulunu kullanarak iki tablo üzerinde işlem yapalım ve sonucunun ne olacağına bakalım.

Bildiğiniz üzere JOIN koşulu iki tabloyu verilen kriterler doğrultusunda birleştirmeye yarar bu konuyu daha ileriki yazılarımda ele almayı planlıyorum. Bu yazımda daha popüler bir konu ele almak istedim cünkü SQL Server forumunu ve sayfalarının trafiğini artırmak lazım bu görevde siz sevgili okurlara düşüyor.

AUTO formatlanmış XML sonucu elde etmek:

1. Internet Explorerı çalıştırın ve adres bara şunları yazın
   
http://localhost/xmltest?sql=SELECT+customers.CustomerID,OrderID,OrderDate+FROM+Customers+
INNER+JOIN+Orders+ON+customers.CustomerID=
orders.CustomerID+ORDER+BY+customers.CustomerID,
OrderID+FOR+XML+AUTO&root=root

2. Adres cubuğunda sorguyu calıştırmak için ENTER tuşuna basın.

evet sonuc nasıl arakadaşlar aşağıdaki gibi değilmi?
 

  <?xml version="1.0" encoding="utf-8" ?>
- <root>
- <Customers CustomerID="ALFKI">
  <Orders OrderID="10643" OrderDate="1997-08-25T00:00:00" />
  <Orders OrderID="10692" OrderDate="1997-10-03T00:00:00" />
  <Orders OrderID="10702" OrderDate="1997-10-13T00:00:00" />
  <Orders OrderID="10835" OrderDate="1998-01-15T00:00:00" />
  <Orders OrderID="10952" OrderDate="1998-03-16T00:00:00" />
  <Orders OrderID="11011" OrderDate="1998-04-09T00:00:00" />
  </Customers>
- <Customers CustomerID="ANATR">
  <Orders OrderID="10308" OrderDate="1996-09-18T00:00:00" />
  <Orders OrderID="10625" OrderDate="1997-08-08T00:00:00" />
  <Orders OrderID="10759" OrderDate="1997-11-28T00:00:00" />
  <Orders OrderID="10926" OrderDate="1998-03-04T00:00:00" />
  </Customers>
.......................................
  </root>

Bu yöntemle istediğiniz her türlü SQL Cümleciğinin sonucunu internet üzerinden XML olarak almanız mümkün hatta Store Presedure sonuclarını bile. Store Prosedure ve XML Template kullanarak İnternet üzerinden XML Formatında veri sunma işlemlerini bir sonraki yazıma saklıyorum.

Şimdilik yazacaklarım bu kadar umarım faydalı olmuştur.

İşlerinizde başarılar bol kazançlı ve mutluluk dolu yarınlar sizlerle olması dileğiyle...

Ahmet ÖZTÜRK
aozturk@sfs.com.tr