共用方式為


開始使用 JSON 功能

適用於:Fabric 中的 Azure SQL 資料庫 Azure SQL 受控執行個體SQL 資料庫

Azure SQL Database、Microsoft Fabric 中的 SQL 資料庫和 Azure SQL 受控實例可讓您剖析和查詢以 JavaScript 物件表示法 (JSON) 格式表示的數據,並將關係型數據導出為 JSON 文字。 可用的 JSON 案例如下:

以 JSON 格式格式化關係型數據

如果您有從資料庫層取得資料,並將其以 JSON 格式回傳的 Web 服務,或有接受 JSON 資料格式的用戶端 JavaScript 架構或程式庫,可以在 SQL 查詢中直接將 資料庫內容格式化為 JSON。 您不再需要撰寫將結果格式化為 JSON 的應用程式程式代碼,或包含一些 JSON 串行化連結庫,將表格式查詢結果轉換為 JSON 格式,然後將物件串行化為 JSON 格式。 相反地,您可以使用 FOR JSON 子句將 SQL 查詢結果格式化為 JSON,並直接在應用程式中使用它。

在下列範例中,Sales.Customer 資料表中的資料列會使用 FOR JSON 子句來格式化為 JSON:

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

子句會將 FOR JSON PATH 查詢的結果格式化為 JSON 文字。 資料欄名稱會用作索引鍵,而資料格值則作 JSON 值產生:

[
{"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"}
]

結果集會格式化為 JSON 陣列,其中每行資料列會格式化為單獨的 JSON 物件。

PATH 表示您可以使用資料行別名中的點符號表示法來自訂義您的 JSON 結果的輸出格式。 下列查詢會變更輸出 JSON 格式的索引鍵名稱 CustomerName ,並將電話號碼和傳真號放在子物件中 Contact

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

此查詢的輸出如下所示:

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

在此範例中,我們藉由指定 [WITHOUT_ARRAY_WRAPPER] 選項回傳單一 JSON 物件,而非陣列。 如果您知道會以查詢結果回傳單一物件,則可使用此選項。

子句的主要值 FOR JSON 是,它可讓您從格式化為巢狀 JSON 物件或陣列的資料庫傳回複雜的階層式數據。 下列範例顯示了如何將包括屬於 OrdersCustomer 資料表中的資料列,做為 Orders 的巢狀陣列:

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

您可以透過單一查詢來取得所有必要的數據,而不是傳送個別查詢來取得 Customer 數據,然後擷取相關 Orders清單,如下列範例輸出所示:

{
  "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 數據

如果您沒有嚴格的結構化資料,且擁有複雜的子物件、陣列或階層式資料,或者資料結構隨時間演進,JSON 格式可助於代表任何複雜的資料結構。

JSON 是文字格式,可以像任何其他字串類型一樣使用。 您可以將 JSON 資料傳送或儲存為標準 nvarchar

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

此範例中使用的 JSON 數據會使用 nvarchar(MAX) 類型來表示。 JSON 可插入此資料表,或使用標準 Transact-SQL 語法提供作為預存程序的引數,如下列範例所示:

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

任何搭配字串數據使用的用戶端語言或連結庫,也會使用 JSON 數據。 JSON 可以儲存在任何支援 nvarchar 類型的數據表中,例如記憶體優化數據表或系統版本數據表。 JSON 不會在用戶端程式碼或資料庫層中導入任何條件約束。

查詢 JSON 資料

如果您的數據格式化為儲存在數據表中的 JSON,JSON 函式可讓您在任何 SQL 查詢中使用這項數據。

JSON 函式 可讓您將格式化為 JSON 的數據視為任何其他 SQL 資料類型。 您可輕鬆地從 JSON 文字擷取值,並在任何查詢中使用 JSON 資料:

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 式會從儲存在數據行中的 JSON 文字擷取值。 此函式會使用類似 JavaScript 的路徑,參考 JSON 文字中的值進行擷取。 擷取的值可用於 SQL 查詢中的任何部分。

JSON_QUERY 式類似於 JSON_VALUE。 不同於 JSON_VALUE,此函式會擷取複雜的子物件,例如 JSON 文字中放置的陣列或物件。

這個JSON_MODIFY函數可讓您指定需要更新的 JSON 文本中值的路徑,並提供一個新值以覆寫舊值。 如此一來,您可以輕鬆地更新 JSON 文字,不需要重新剖析整個結構。

由於 JSON 會儲存於標準文字,因此不保證儲存在文字資料欄中的值格式正確。 您可以使用標準檢查條件約束和函式,確認儲存在 JSON 資料列中的 ISJSON 文字已正確格式化:

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

如果輸入文字的格式正確為 JSON,函 ISJSON 式會傳回 值 1。 在 JSON 資料欄的每次插入或更新,此條件約束將會驗證新的文字值並未採用格式錯誤的 JSON。

將 JSON 轉換成表格式格式

您可以將 JSON 集合轉換成表格式格式,並載入或查詢 JSON 資料。

OPENJSON 是一個表值 T-SQL 函式,用於剖析 JSON 文字、尋找 JSON 物件的陣列,然後反覆迭代陣列的元素,並為陣列中的每個元素在輸出結果中傳回一個列。

範例 JSON 表格式數據的螢幕快照和代碼段。

在此範例中,我們可以指定在何處找出應該開啟的 JSON 陣列(在路徑中 $.Orders )、應該傳回哪些數據行,以及在哪裡尋找要當做單元格傳回的 JSON 值。

我們可將 @orders 變數中的 JSON 陣列轉換為資料列集、分析此結果集,或將資料列插入標準資料表:

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 陣列的訂單集錦,並作為參數提供給預存程序,以進行剖析並插入訂單資料表。