Enes TAŞ

Developer

MS SQL'de JSON Verileriye Çalışmak PART-1 (JSON Formatında Veri Çekme) 30.04.2019

SQL SERVER 2016 sürümüyle gelen JSON desteğinin yerelde pek fazla kaynağı olmadığını fark ederek detaylı bir makale dizisi hazırlamaya karar verdim. İş hayatımızda JSON verilerini sıklıkla kullanıyoruz. SQL SERVER'a JSON veri desteği gelmeden önce veritabanındaki verilerimize JSON formatında ihtiyaç duyduğumuzda bunu farklı yollarla yapıyorduk, ben .Net ortamında geliştirme yaptığım için Newtonsoft.Json kütüphanesini kullanıyordum. Ancak 2016 sürümüyle gelen bu özellik işlerimi daha da kolaylaştırmaya yaradı diyebilirim. Bana göre performans konusunda da gayet başarılı. Uzatmadan konumuza başlayalım :)

Bu dizinin ilk makalesinde veritabanımızdaki bir tabloyu JSON veri formatında almanın yollarını inceleyeceğiz. 

Öncelikle veritabanımızda basit bir müşteri tablosu oluşturalım. 

CREATE TABLE [dbo].[Musteri](
	[IDMusteri] [int] IDENTITY(1,1) NOT NULL,
	[Adi] [nvarchar](50) NOT NULL,
	[Telefon] [nvarchar](20) NULL,
	[MailAdresi] [nvarchar](50) NULL,
 CONSTRAINT [PK_Musteri] PRIMARY KEY CLUSTERED 
(
	[IDMusteri] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Tablomuza örnek veriler ekleyelim. 

Insert into Musteri(Adi,Telefon,MailAdresi) Values('Enes TAŞ', '555-111-11-11','[email protected]')
Insert into Musteri(Adi,Telefon,MailAdresi) Values('Şaban ÇATALLAR', '555-222-22-22',null)
Insert into Musteri(Adi,Telefon,MailAdresi) Values('Volkan GÜLBUDAK', '555-333-33-33',null)

Şimdi tablomuzdaki verileri JSON formatında çekelim. Bunun için normal SELECT sorgumuzun sonuna FOR JSON AUTO komutu eklemek yeterli olacaktır. 

SELECT * FROM Musteri FOR JSON AUTO

Bu sorgunun sonucunda bize aşağıdaki şekilde bir veri dönecektir. 

[
   {
      "IDMusteri":1,
      "Adi":"Enes TAŞ",
      "Telefon":"555-111-11-11",
      "MailAdresi":"[email protected]"
   },
   {
      "IDMusteri":2,
      "Adi":"Şaban ÇATALLAR",
      "Telefon":"555-222-22-22"
   },
   {
      "IDMusteri":3,
      "Adi":"Volkan GÜLBUDAK",
      "Telefon":"555-333-33-33"
   }
]

Ancak burada MailAdresi bilgisini null olarak girdiğimiz müşterilerin MailAdresi alanı JSON verimizde gelmedi. Tablomuzda değeri null olan alanlarımızında JSON verimizde gelmesini istiyorsak sorgumuzu aşağıdaki şekilde yazmalıyız.

SELECT * FROM Musteri FOR JSON AUTO, INCLUDE_NULL_VALUES

Sorgumuzun sonuna  eklediğimiz INCLUDE_NULL_VALUES komutu, tablomuzdaki null değerlerinde JSON verimizde gelmesini sağlayacaktır. 


Eğer almak istediğimiz JSON formatında özelleştirmeler yapmak istiyorsak, FOR JSON AUTO komutu yerine FOR JSON PATH komutunu kullanabiliriz. 

Örneğin Telefon ve MailAdresi bilgilerini Iletisim başlığı altında ayrı bir grup, nesne olarak almayı deneyelim. Bunun için aşağıdaki sorgumuzu yazıyoruz. 

SELECT IDMusteri,Adi, Telefon as 'Iletisim.Telefon', MailAdresi as 'Iletisim.MailAdresi' 
FROM Musteri FOR JSON PATH, INCLUDE_NULL_VALUES

Telefon ve MailAdresi alanlarımızı 'Iletisim.Telefon' ve 'Iletisim.MailAdresi' olarak tekrar isimlendirdiğimizde bu iki alanı Iletisim adında bir key oluşturup o key'in property-leri olarak ekleyecektir. 

Bu sorgumuzun sonucundaki JSON verimizin formatı aşağıdaki şekilde olacaktır.

[
   {
      "IDMusteri":1,
      "Adi":"Enes TAŞ",
      "Iletisim":{
         "Telefon":"555-111-11-11",
         "MailAdresi":"[email protected]"
      }
   },
   {
      "IDMusteri":2,
      "Adi":"Şaban ÇATALLAR",
      "Iletisim":{
         "Telefon":"555-222-22-22",
         "MailAdresi":null
      }
   },
   {
      "IDMusteri":3,
      "Adi":"Volkan GÜLBUDAK",
      "Iletisim":{
         "Telefon":"555-333-33-33",
         "MailAdresi":null
      }
   }
]

Bu makalemizde veritabanımızdaki verileri JSON formatında alabilmeyi inceledik, makalemizin giriş için yeterli olduğunu düşünüyorum. Serimizin bir sonraki makalesinde ise JSON destekli fonksiyonların kullanımını ve ilerleyen makalelerde JSON formatındaki bir veriyi tablomuza nasıl aktarabiliriz bunu inceleyeceğiz. 


Etiketler

SQL
hülya - 24.01.2020 13:28

emeğiniz için çok teşekkürler.

Enes - 25.01.2020 12:00

Rica ederim

Topur oglu Umit - 12.06.2021 11:19

Emeginize saglik hocam, sizinle tanismak isterim. Yunanistandan selamlar :)

Enes - 13.06.2021 18:44

Teşekkürler, tanışalım elbette. Çok memnun olurum :)

Yorum Yap