Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği'nde JSON özelliklerini kullanmaya başlama

Şunlar için geçerlidir:Azure SQL VeritabanıAzure SQL Yönetilen Örneği

Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği, JavaScript Nesne Gösterimi (JSON) biçiminde gösterilen verileri ayrıştırmanıza ve sorgulamanıza ve ilişkisel verilerinizi JSON metni olarak dışarı aktarmanıza olanak tanır. Aşağıdaki JSON senaryoları kullanılabilir:

İlişkisel verileri JSON biçiminde biçimlendirme

Veritabanı katmanından veri alan ve JSON biçiminde bir yanıt sağlayan bir web hizmetiniz veya JSON olarak biçimlendirilmiş verileri kabul eden istemci tarafı JavaScript çerçeveleri veya kitaplıklarınız varsa, veritabanı içeriğinizi doğrudan bir SQL sorgusunda JSON olarak biçimlendirebilirsiniz. Artık Azure SQL Veritabanı veya Azure SQL Yönetilen Örneği'nden gelen sonuçları JSON olarak biçimlendiren uygulama kodu yazmanız veya tablosal sorgu sonuçlarını dönüştürmek ve sonra nesneleri JSON biçimine seri hale getirmek için bazı JSON serileştirme kitaplığı eklemeniz gerekmez. Bunun yerine, FOR JSON yan tümcesini kullanarak SQL sorgu sonuçlarını JSON olarak biçimlendirebilir ve doğrudan uygulamanızda kullanabilirsiniz.

Aşağıdaki örnekte, FOR JSON yan tümcesi kullanılarak tablodaki Sales.Customer satırlar JSON olarak biçimlendirilir:

select CustomerName, PhoneNumber, FaxNumber
from Sales.Customers
FOR JSON PATH

FOR JSON PATH yan tümcesi, sorgunun sonuçlarını JSON metni olarak biçimlendirer. Sütun adları anahtar olarak kullanılırken, hücre değerleri JSON değerleri olarak oluşturulur:

[
{"CustomerName":"Eric Torres","PhoneNumber":"(307) 555-0100","FaxNumber":"(307) 555-0101"},
{"CustomerName":"Cosmina Vlad","PhoneNumber":"(505) 555-0100","FaxNumber":"(505) 555-0101"},
{"CustomerName":"Bala Dixit","PhoneNumber":"(209) 555-0100","FaxNumber":"(209) 555-0101"}
]

Sonuç kümesi, her satırın ayrı bir JSON nesnesi olarak biçimlendirildiği bir JSON dizisi olarak biçimlendirilir.

PATH, sütun diğer adlarında noktalı gösterimi kullanarak JSON sonucunuzun çıkış biçimini özelleştirebileceğinizi gösterir. Aşağıdaki sorgu çıktı JSON biçimindeki "CustomerName" anahtarının adını değiştirir ve telefon ve faks numaralarını "Kişi" alt nesnesine yerleştirir:

select CustomerName as Name, PhoneNumber as [Contact.Phone], FaxNumber as [Contact.Fax]
from Sales.Customers
where CustomerID = 931
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

Bu sorgunun çıktısı şöyle görünür:

{
    "Name":"Nada Jovanovic",
    "Contact":{
           "Phone":"(215) 555-0100",
           "Fax":"(215) 555-0101"
    }
}

Bu örnekte, WITHOUT_ARRAY_WRAPPER seçeneğini belirterek dizi yerine tek bir JSON nesnesi döndürdü. Sorgu sonucunda tek bir nesne döndürdüğünü biliyorsanız bu seçeneği kullanabilirsiniz.

FOR JSON yan tümcesinin ana değeri, veritabanınızdan iç içe JSON nesneleri veya dizileri olarak biçimlendirilmiş karmaşık hiyerarşik veriler döndürmenize olanak tanır. Aşağıdaki örnekte, tablosundan iç içe dizi olarak ait olan satırların Orders nasıl eklendiği gösterilmektedirOrders:Customer

select CustomerName as Name, PhoneNumber as Phone, FaxNumber as Fax,
        Orders.OrderID, Orders.OrderDate, Orders.ExpectedDeliveryDate
from Sales.Customers Customer
    join Sales.Orders Orders
        on Customer.CustomerID = Orders.CustomerID
where Customer.CustomerID = 931
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER

Müşteri verilerini almak ve ardından ilgili Siparişlerin listesini getirmek için ayrı sorgular göndermek yerine, aşağıdaki örnek çıktıda gösterildiği gibi gerekli tüm verileri tek bir sorguyla alabilirsiniz:

{
  "Name":"Nada Jovanovic",
  "Phone":"(215) 555-0100",
  "Fax":"(215) 555-0101",
  "Orders":[
    {"OrderID":382,"OrderDate":"2013-01-07","ExpectedDeliveryDate":"2013-01-08"},
    {"OrderID":395,"OrderDate":"2013-01-07","ExpectedDeliveryDate":"2013-01-08"},
    {"OrderID":1657,"OrderDate":"2013-01-31","ExpectedDeliveryDate":"2013-02-01"}
  ]
}

JSON verileriyle çalışma

Kesin olarak yapılandırılmış verileriniz yoksa, karmaşık alt nesneleriniz, dizileriniz veya hiyerarşik verileriniz varsa ya da veri yapılarınız zaman içinde gelişirse, JSON biçimi herhangi bir karmaşık veri yapısını temsil etme konusunda size yardımcı olabilir.

JSON, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği'ndeki diğer dize türleri gibi kullanılabilen bir metin biçimidir. JSON verilerini standart bir NVARCHAR olarak gönderebilir veya depolayabilirsiniz:

CREATE TABLE Products (
  Id int identity primary key,
  Title nvarchar(200),
  Data nvarchar(max)
)
go
CREATE PROCEDURE InsertProduct(@title nvarchar(200), @json nvarchar(max))
AS BEGIN
    insert into Products(Title, Data)
    values(@title, @json)
END

Bu örnekte kullanılan JSON verileri NVARCHAR(MAX) türü kullanılarak temsil edilir. JSON bu tabloya eklenebilir veya aşağıdaki örnekte gösterildiği gibi standart Transact-SQL söz dizimi kullanılarak saklı yordamın bağımsız değişkeni olarak sağlanabilir:

EXEC InsertProduct 'Toy car', '{"Price":50,"Color":"White","tags":["toy","children","games"]}'

Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği'nde dize verileriyle çalışan tüm istemci tarafı diller veya kitaplıklar da JSON verileriyle çalışır. JSON, Bellek için iyileştirilmiş tablo veya Sistem sürümüne sahip bir tablo gibi NVARCHAR türünü destekleyen herhangi bir tabloda depolanabilir. JSON, istemci tarafı kodunda veya veritabanı katmanında herhangi bir kısıtlamaya neden olmaz.

JSON verilerini sorgulama

Azure SQL tablolarında JSON olarak biçimlendirilmiş verileriniz varsa, JSON işlevleri bu verileri herhangi bir SQL sorgusunda kullanmanıza olanak sağlar.

Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği'nde kullanılabilen JSON işlevleri, JSON olarak biçimlendirilmiş verileri başka bir SQL veri türü olarak işlemenizi sağlar. JSON metnindeki değerleri kolayca ayıklayabilir ve herhangi bir sorguda JSON verilerini kullanabilirsiniz:

select Id, Title, JSON_VALUE(Data, '$.Color'), JSON_QUERY(Data, '$.tags')
from Products
where JSON_VALUE(Data, '$.Color') = 'White'

update Products
set Data = JSON_MODIFY(Data, '$.Price', 60)
where Id = 1

JSON_VALUE işlevi, Veri sütununda depolanan JSON metninden bir değer ayıklar. Bu işlev, ayıklamak için JSON metnindeki bir değere başvurmak için JavaScript benzeri bir yol kullanır. Ayıklanan değer SQL sorgusunun herhangi bir bölümünde kullanılabilir.

JSON_QUERY işlevi JSON_VALUE benzer. JSON_VALUE aksine, bu işlev JSON metnine yerleştirilmiş diziler veya nesneler gibi karmaşık alt nesneyi ayıklar.

JSON_MODIFY işlevi, güncelleştirilmesi gereken JSON metnindeki değerin yolunu ve eskisinin üzerine yazılacak yeni bir değeri belirtmenize olanak tanır. Bu şekilde, tüm yapıyı yeniden ayrıştırmadan JSON metnini kolayca güncelleştirebilirsiniz.

JSON standart bir metinde depolandığından, metin sütunlarında depolanan değerlerin düzgün biçimlendirildiğinin garantisi yoktur. Standart Azure SQL Veritabanı denetim kısıtlamalarını ve ISJSON işlevini kullanarak JSON sütununda depolanan metnin düzgün biçimlendirildiğini doğrulayabilirsiniz:

ALTER TABLE Products
    ADD CONSTRAINT [Data should be formatted as JSON]
        CHECK (ISJSON(Data) > 0)

Giriş metni düzgün biçimlendirilmiş JSON ise, ISJSON işlevi 1 değerini döndürür. JSON sütununun her eklemesinde veya güncelleştirmesinde, bu kısıtlama yeni metin değerinin yanlış biçimlendirilmiş JSON olmadığını doğrular.

JSON'yi tablo biçiminde dönüştürme

Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği, JSON koleksiyonlarını tablo biçiminde dönüştürmenize ve JSON verilerini yüklemenize veya sorgulamanıza da olanak tanır.

OPENJSON, JSON metnini ayrıştıran, JSON nesneleri dizisini bulayan, dizinin öğeleri arasında yineleyen ve dizinin her öğesi için çıkış sonucunda bir satır döndüren bir tablo-değer işlevidir.

JSON tabular

Yukarıdaki örnekte, açılması gereken JSON dizisinin nerede bulunacağını belirtebiliriz ($. Sipariş yolu), sonuç olarak döndürülmesi gereken sütunlar ve hücre olarak döndürülecek JSON değerlerinin nerede bulunacağı.

Değişkendeki bir JSON dizisini @orders bir satır kümesine dönüştürebilir, bu sonuç kümesini analiz edebilir veya standart bir tabloya satır ekleyebiliriz:

CREATE PROCEDURE InsertOrders(@orders nvarchar(max))
AS BEGIN

    insert into Orders(Number, Date, Customer, Quantity)
    select Number, Date, Customer, Quantity
    FROM OPENJSON (@orders)
     WITH (
            Number varchar(200),
            Date datetime,
            Customer varchar(200),
            Quantity int
     )
END

JSON dizisi olarak biçimlendirilen ve saklı yordama parametre olarak sağlanan sipariş koleksiyonu ayrıştırılabilir ve Orders tablosuna eklenebilir.