SQL LIFE

SQL FOR XML PATH Kullanımı

sql server for xml path kullanımı, sql server for xml raw kullanımı

Merhaba,  bu yazımda SQL ( sql for xml path , for xml raw ) aracılığı ile XML ( Extensible Markup Language ) yapılarında veriler sonuç olarak alacağız. Farklı platformlarda geliştirilmiş iki uygulama arasında veri alışverişi yapılacaksa bir standart kullanmaktayız. Bu standart veri yapısı kimi zaman xml kimi zaman json olarak tercih edilmektedir.
Bu yazımda XML kısmına odaklanacağım bir sonra ki yazımda da JSON veri yapısına değineceğim.
Her XML dokümanı en az bir root nod’dan ve bu root nod ile ilişkili child nod’lardan oluşur.

SQL Server tarafında yapılabilecek temel XML işlemleri 3 farklı kategoride özetlenmektedir:

  1. XML dokümanlarının oluşturulması

  2. XML dokümanlarının sorgulanması

  3. XML dokümanlarının doğrulanması

 
XML dokümanlarının oluşturulması
Şimdi 2 kayıtlık bir veri setimiz olsun ve bunu XML sonuç döndürelim, başka tabloya bağlantı kuralım ve buradan birkaç alan alalım ve aldığımız bu alanları da XML veri setine

SELECT top 2
 Location.bus_id
 ,optime
 ,latitude
 ,longtitude
 ,altitude
 ,Users.name
,Users.company
FROM dbo.Location
 INNER JOIN  Users  ON Location.bus_id = Users.bus_id
FOR XML AUTO,ELEMENTS,ROOT('Lokasyon')
<Lokasyon>
<dbo.Location>
<bus_id>74DA421</bus_id><optime>2018-05-20T14:27:58.473</optime>
<latitude>37.583897200</latitude>
<longtitude>36.880914900</longtitude>
<altitude>697.554047408</altitude>
<Users>
<name>Ezgim</name>
<company>Akedas</company>
</Users>
</dbo.Location>
<dbo.Location>
<bus_id>74DA421</bus_id>
<optime>2018-05-20T14:32:59.227</optime>
<latitude>37.583897200</latitude>
<longtitude>36.880914900</longtitude>
<altitude>697.554047408</altitude>
<Users>
<name>Ezgim</name>
<company>Akedas</company>
</Users>
</dbo.Location>
</Lokasyon>

FOR XML RAW Kullanımı

 
FOR XML RAW komutu ile ana elementin adını da değiştirebiliriz. FOR XML AUTO ile ana element adı tablo adımız ile aynı oluyordu.

SELECT top 2
 Location.bus_id
 ,optime
 ,latitude
 ,longtitude
 ,altitude
 ,Users.name
,Users.company
FROM dbo.Location
 INNER JOIN  Users  ON Location.bus_id = Users.bus_id
FOR XML RAW('GIS'),ELEMENTS,ROOT('Lokasyon')
<Lokasyon>
<GIS>
<bus_id>74DA421</bus_id>
<optime>2018-05-20T14:27:58.473</optime>
<latitude>37.583897200</latitude>
<longtitude>36.880914900</longtitude>
<altitude>697.554047408</altitude>
<name>Ezgim</name>
<company>Akedas</company></GIS>
<GIS>
<bus_id>74DA421</bus_id>
<optime>2018-05-20T14:32:59.227</optime>
<latitude>37.583897200</latitude><longtitude>36.880914900</longtitude>
<altitude>697.554047408</altitude><name>Ezgim</name>
<company>Akedas</company>
</GIS>
</Lokasyon>


FOR XML PATH Kullanımı

 

Kullanımı gayet kolaydır. Otomatik olarak hiyerarşi oluşturulmaktadır.

SELECT top 2
 Location.bus_id
 ,optime
 ,latitude
 ,longtitude
 ,altitude
 ,Users.name
,Users.company
FROM dbo.Location
 INNER JOIN  Users  ON Location.bus_id = Users.bus_id
FOR XML PATH('GIS'),ROOT('Lokasyon')
<Lokasyon>
<GIS>
<bus_id>74DA421</bus_id>
<optime>2018-05-20T14:27:58.473</optime>
<latitude>37.583897200</latitude>
<longtitude>36.880914900</longtitude>
<altitude>697.554047408</altitude>
<name>Ezgim</name>
<company>Akedas</company>
</GIS>
<GIS>
<bus_id>74DA421</bus_id>
<optime>2018-05-20T14:32:59.227</optime>
<latitude>37.583897200</latitude>
<longtitude>36.880914900</longtitude>
<altitude>697.554047408</altitude>
<name>Ezgim</name>
<company>Akedas</company>
</GIS>
</Lokasyon>

Buradaki kullanımda ise bir değerini element olarak değil de var olan bir elemente öznitelik olarak eklemek için o değer için alias verirken başına “@” işareti koymak yeterlidir. Bus_id alanını öznitelik olarak GIS elementine ekleyelim.

 

SELECT top 2
 Location.bus_id "@ID"
 ,optime
 ,latitude
 ,longtitude
 ,altitude
 ,Users.name
,Users.company
FROM dbo.Location
 INNER JOIN  Users  ON Location.bus_id = Users.bus_id
FOR XML PATH('GIS'),ROOT('Lokasyon')
<Lokasyon>
    <GIS ID="74DA421">
        <optime>2018-05-20T14:27:58.473</optime>
        <latitude>37.583897200</latitude>
        <longtitude>36.880914900</longtitude>
        <altitude>697.554047408</altitude>
        <name>Ezgim</name>
        <company>Akedas</company>
    </GIS>
    <GIS ID="74DA421">
        <optime>2018-05-20T14:32:59.227</optime>
        <latitude>37.583897200</latitude>
        <longtitude>36.880914900</longtitude>
        <altitude>697.554047408</altitude>
        <name>Ezgim</name>
        <company>Akedas</company>
    </GIS>
</Lokasyon>

 For XML Path komutunun kullanıldığı bir durumdan daha söz edelim. Bazen istenilen raporlarda bir kolondaki verileri yan yana getirmemiz istenebilir veya böyle bir işleme ihtiyacınız olabilir.
Bu sorgu da kullanılan daha önce de bahsettiğim Stuff fonksiyonu, String değerin belirtilen aralıklarına başka bir string ekleme işlemini yapar.
Bu yazıma da göz atabilirsiniz. http://sqllife.net/yazi/ms-sql-string-functions-1

  SELECT bus_id, 
    abc = STUFF(
                 ( SELECT ',' + bus_id FROM [studentBusTrack].[dbo].[Location] FOR XML PATH ('')), 1, 1, ''
               ) 
FROM [studentBusTrack].[dbo].[Location] GROUP BY bus_id

Verdiği çıktı da bu şekilde olacaktır:

for xml path
#
Ezgim Çelik
They didn't know it was impossible, so they did it - Mark Twain