Mssql JSON Kullanımı
Mssql 03 Mayıs, 2020

SQL Server 2016 ile gelen JSON desteğiyle oldukça kullanışlı bir özellik gelmiş oldu. Bunu kullanabilmek için SQL Server 2016 veya daha yeni sürümlerini yüklememiz gerekiyor. 

Şuan yayımda olan SQL Server 2019 versiyonunu indirmek için tıklayınız

Örnek olarak çekeceğimiz Customers tablosunun ilk kaydı şöyledir.

Tablolardan JSON formatında veri almak için Select sorgusunun sonuna FOR JSON PATH | AUTO komutlarını eklemeliyiz. FOR JSON PATH yan tümcesi sorgunun sonuçlarını JSON metni olarak biçimlendirir. Sütun adları anahtar olarak kullanılır, ancak hücre değerleri JSON değerleri olarak oluşturulur:

Aşağıda Customers tablosunun ilk kaydı JSON formatında çekilmektedir.

SELECT TOP(1) * FROM Customers FOR JSON PATH

Sonuç kümesi, her satırın ayrı bir JSON nesnesi olarak biçimlendirildiği bir JSON dizisi olarak biçimlendirilir. Yukarıdaki sorgu sonucunun düzgün hali şöyledir:

[
  {
    "CustomerID": "ALFKI",
    "CompanyName": "Alfreds Futterkiste",
    "ContactName": "Maria Anders",
    "ContactTitle": "Sales Representative",
    "Address": "Obere Str. 57",
    "City": "Berlin",
    "PostalCode": "12209",
    "Country": "Germany",
    "Phone": "030-0074321",
    "Fax": "030-0076545"
  }
]

Burada dikkat ettiyseniz ilk kaydın Region kolonu NULL olduğu için JSON verisinde gelmedi. Default olarak NULL değerler çıktıya dahil edilmez.

İçeriği NULL olan değerleri de dahil etmek için sorgumuza INCLUDE_NULL_VALUES komutunu eklemeliyiz.

SELECT TOP(1) * FROM Customers FOR JSON PATH, INCLUDE_NULL_VALUES 

Sorgumuzun yeni sonucu şöyle olacaktır: Artık Region bilgisi de JSON verimizde bulunmakta.

[
  {
    "CustomerID": "ALFKI",
    "CompanyName": "Alfreds Futterkiste",
    "ContactName": "Maria Anders",
    "ContactTitle": "Sales Representative",
    "Address": "Obere Str. 57",
    "City": "Berlin",
    "Region": null,
    "PostalCode": "12209",
    "Country": "Germany",
    "Phone": "030-0074321",
    "Fax": "030-0076545"
  }
]

Sorgumuza WITHOUT_ARRAY_WRAPPER komutunu eklersek JSON verimizdeki köşeli parantezler olmayacaktır.

SELECT TOP(1) * FROM Customers FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER
{
  "CustomerID": "ALFKI",
  "CompanyName": "Alfreds Futterkiste",
  "ContactName": "Maria Anders",
  "ContactTitle": "Sales Representative",
  "Address": "Obere Str. 57",
  "City": "Berlin",
  "Region": null,
  "PostalCode": "12209",
  "Country": "Germany",
  "Phone": "030-0074321",
  "Fax": "030-0076545"
}

ROOT('CustomerList') keyword ü ile JSON verisini CustomerList isminde parent element içine alabiliriz. Bu komutla birlikte WITHOUT_ARRAY_WRAPPER komutunu JSON veri yapısına uymadığı için kullanamıyoruz.

SELECT TOP(1) * FROM Customers FOR JSON PATH,INCLUDE_NULL_VALUES,ROOT('CustomerList')
{
  "CustomerList": [
    {
      "CustomerID": "ALFKI",
      "CompanyName": "Alfreds Futterkiste",
      "ContactName": "Maria Anders",
      "ContactTitle": "Sales Representative",
      "Address": "Obere Str. 57",
      "City": "Berlin",
      "Region": null,
      "PostalCode": "12209",
      "Country": "Germany",
      "Phone": "030-0074321",
      "Fax": "030-0076545"
    }
  ]
}

Sorgumuzu aşağıdaki gibi değiştirerek JSON formatını istediğimiz şekle sokabiliriz.

SELECT TOP(1) 
	CustomerID AS [CustomerData.CustomerId],
	CompanyName AS [CustomerData.CompanyName],
	ContactName AS [CustomerData.ContactName],
	ContactTitle AS [CustomerData.ContactTitle],
	Address AS [AddressData.Address],
	City AS [AddressData.City],
	Region AS [AddressData.Region],
	PostalCode AS [AddressData.PostalCode],
	Country AS [AddressData.Country],
	Phone AS [AddressData.Phone],
	Fax AS [AddressData.Fax]
FROM Customers FOR JSON PATH,INCLUDE_NULL_VALUES,ROOT('CustomerList')
{
  "CustomerList": [
    {
      "CustomerData": {
        "CustomerId": "ALFKI",
        "CompanyName": "Alfreds Futterkiste",
        "ContactName": "Maria Anders",
        "ContactTitle": "Sales Representative"
      },
      "AddressData": {
        "Address": "Obere Str. 57",
        "City": "Berlin",
        "Region": null,
        "PostalCode": "12209",
        "Country": "Germany",
        "Phone": "030-0074321",
        "Fax": "030-0076545"
      }
    }
  ]
}

FOR JSON AUTO komutu da FOR JSON PATH gibi çalışır ancak AUTO seçeneğini kullandığınızda, JSON çıktısının biçimi, tablonun sütunların sırasına ve kaynak tablolarına göre otomatik olarak belirlenir. Bu biçimi değiştiremezsiniz.

Örneğin yukarıdaki sorguyu FOR JSON AUTO ile yazarsak şöyle bir sonuç çıkar:

SELECT TOP(1) 
	CustomerID AS [CustomerData.CustomerId],
	CompanyName AS [CustomerData.CompanyName],
	ContactName AS [CustomerData.ContactName],
	ContactTitle AS [CustomerData.ContactTitle],
	Address AS [AddressData.Address],
	City AS [AddressData.City],
	Region AS [AddressData.Region],
	PostalCode AS [AddressData.PostalCode],
	Country AS [AddressData.Country],
	Phone AS [AddressData.Phone],
	Fax AS [AddressData.Fax]
FROM Customers FOR JSON AUTO,INCLUDE_NULL_VALUES,ROOT('CustomerList')
{
  "CustomerList": [
    {
      "CustomerData.CustomerId": "ALFKI",
      "CustomerData.CompanyName": "Alfreds Futterkiste",
      "CustomerData.ContactName": "Maria Anders",
      "CustomerData.ContactTitle": "Sales Representative",
      "AddressData.Address": "Obere Str. 57",
      "AddressData.City": "Berlin",
      "AddressData.Region": null,
      "AddressData.PostalCode": "12209",
      "AddressData.Country": "Germany",
      "AddressData.Phone": "030-0074321",
      "AddressData.Fax": "030-0076545"
    }
  ]
}

Kaynaklar ve daha fazlası için bkz:

Kodlamaya devam!

 

Yorumlar

Mssql JSON Kullanımı
Mssql 03 Mayıs, 2020

SQL Server 2016 ile gelen JSON desteğiyle oldukça kullanışlı bir özellik gelmiş oldu. Bunu kullanabilmek için SQL Server 2016 veya daha yeni sürümlerini yüklememiz gerekiyor. 

Şuan yayımda olan SQL Server 2019 versiyonunu indirmek için tıklayınız

Örnek olarak çekeceğimiz Customers tablosunun ilk kaydı şöyledir.

Tablolardan JSON formatında veri almak için Select sorgusunun sonuna FOR JSON PATH | AUTO komutlarını eklemeliyiz. FOR JSON PATH yan tümcesi sorgunun sonuçlarını JSON metni olarak biçimlendirir. Sütun adları anahtar olarak kullanılır, ancak hücre değerleri JSON değerleri olarak oluşturulur:

Aşağıda Customers tablosunun ilk kaydı JSON formatında çekilmektedir.

SELECT TOP(1) * FROM Customers FOR JSON PATH

Sonuç kümesi, her satırın ayrı bir JSON nesnesi olarak biçimlendirildiği bir JSON dizisi olarak biçimlendirilir. Yukarıdaki sorgu sonucunun düzgün hali şöyledir:

[
  {
    "CustomerID": "ALFKI",
    "CompanyName": "Alfreds Futterkiste",
    "ContactName": "Maria Anders",
    "ContactTitle": "Sales Representative",
    "Address": "Obere Str. 57",
    "City": "Berlin",
    "PostalCode": "12209",
    "Country": "Germany",
    "Phone": "030-0074321",
    "Fax": "030-0076545"
  }
]

Burada dikkat ettiyseniz ilk kaydın Region kolonu NULL olduğu için JSON verisinde gelmedi. Default olarak NULL değerler çıktıya dahil edilmez.

İçeriği NULL olan değerleri de dahil etmek için sorgumuza INCLUDE_NULL_VALUES komutunu eklemeliyiz.

SELECT TOP(1) * FROM Customers FOR JSON PATH, INCLUDE_NULL_VALUES 

Sorgumuzun yeni sonucu şöyle olacaktır: Artık Region bilgisi de JSON verimizde bulunmakta.

[
  {
    "CustomerID": "ALFKI",
    "CompanyName": "Alfreds Futterkiste",
    "ContactName": "Maria Anders",
    "ContactTitle": "Sales Representative",
    "Address": "Obere Str. 57",
    "City": "Berlin",
    "Region": null,
    "PostalCode": "12209",
    "Country": "Germany",
    "Phone": "030-0074321",
    "Fax": "030-0076545"
  }
]

Sorgumuza WITHOUT_ARRAY_WRAPPER komutunu eklersek JSON verimizdeki köşeli parantezler olmayacaktır.

SELECT TOP(1) * FROM Customers FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER
{
  "CustomerID": "ALFKI",
  "CompanyName": "Alfreds Futterkiste",
  "ContactName": "Maria Anders",
  "ContactTitle": "Sales Representative",
  "Address": "Obere Str. 57",
  "City": "Berlin",
  "Region": null,
  "PostalCode": "12209",
  "Country": "Germany",
  "Phone": "030-0074321",
  "Fax": "030-0076545"
}

ROOT('CustomerList') keyword ü ile JSON verisini CustomerList isminde parent element içine alabiliriz. Bu komutla birlikte WITHOUT_ARRAY_WRAPPER komutunu JSON veri yapısına uymadığı için kullanamıyoruz.

SELECT TOP(1) * FROM Customers FOR JSON PATH,INCLUDE_NULL_VALUES,ROOT('CustomerList')
{
  "CustomerList": [
    {
      "CustomerID": "ALFKI",
      "CompanyName": "Alfreds Futterkiste",
      "ContactName": "Maria Anders",
      "ContactTitle": "Sales Representative",
      "Address": "Obere Str. 57",
      "City": "Berlin",
      "Region": null,
      "PostalCode": "12209",
      "Country": "Germany",
      "Phone": "030-0074321",
      "Fax": "030-0076545"
    }
  ]
}

Sorgumuzu aşağıdaki gibi değiştirerek JSON formatını istediğimiz şekle sokabiliriz.

SELECT TOP(1) 
	CustomerID AS [CustomerData.CustomerId],
	CompanyName AS [CustomerData.CompanyName],
	ContactName AS [CustomerData.ContactName],
	ContactTitle AS [CustomerData.ContactTitle],
	Address AS [AddressData.Address],
	City AS [AddressData.City],
	Region AS [AddressData.Region],
	PostalCode AS [AddressData.PostalCode],
	Country AS [AddressData.Country],
	Phone AS [AddressData.Phone],
	Fax AS [AddressData.Fax]
FROM Customers FOR JSON PATH,INCLUDE_NULL_VALUES,ROOT('CustomerList')
{
  "CustomerList": [
    {
      "CustomerData": {
        "CustomerId": "ALFKI",
        "CompanyName": "Alfreds Futterkiste",
        "ContactName": "Maria Anders",
        "ContactTitle": "Sales Representative"
      },
      "AddressData": {
        "Address": "Obere Str. 57",
        "City": "Berlin",
        "Region": null,
        "PostalCode": "12209",
        "Country": "Germany",
        "Phone": "030-0074321",
        "Fax": "030-0076545"
      }
    }
  ]
}

FOR JSON AUTO komutu da FOR JSON PATH gibi çalışır ancak AUTO seçeneğini kullandığınızda, JSON çıktısının biçimi, tablonun sütunların sırasına ve kaynak tablolarına göre otomatik olarak belirlenir. Bu biçimi değiştiremezsiniz.

Örneğin yukarıdaki sorguyu FOR JSON AUTO ile yazarsak şöyle bir sonuç çıkar:

SELECT TOP(1) 
	CustomerID AS [CustomerData.CustomerId],
	CompanyName AS [CustomerData.CompanyName],
	ContactName AS [CustomerData.ContactName],
	ContactTitle AS [CustomerData.ContactTitle],
	Address AS [AddressData.Address],
	City AS [AddressData.City],
	Region AS [AddressData.Region],
	PostalCode AS [AddressData.PostalCode],
	Country AS [AddressData.Country],
	Phone AS [AddressData.Phone],
	Fax AS [AddressData.Fax]
FROM Customers FOR JSON AUTO,INCLUDE_NULL_VALUES,ROOT('CustomerList')
{
  "CustomerList": [
    {
      "CustomerData.CustomerId": "ALFKI",
      "CustomerData.CompanyName": "Alfreds Futterkiste",
      "CustomerData.ContactName": "Maria Anders",
      "CustomerData.ContactTitle": "Sales Representative",
      "AddressData.Address": "Obere Str. 57",
      "AddressData.City": "Berlin",
      "AddressData.Region": null,
      "AddressData.PostalCode": "12209",
      "AddressData.Country": "Germany",
      "AddressData.Phone": "030-0074321",
      "AddressData.Fax": "030-0076545"
    }
  ]
}

Kaynaklar ve daha fazlası için bkz:

Kodlamaya devam!

 

Yorumlar