OPENJSON 行集函數可將 JSON 文本轉換為一組行和列。 使用 OPENJSON 將 JSON 集合轉換為行集后,可以在返回的數據上運行任意 SQL 查詢或將其插入到 SQL Server 表中 。
OPENJSON 函數采用單個 JSON 對象或 JSON 對象的集合,並將其轉換為一行或多行。 OPENJSON 函數默認返回以下數據 :
- 從 JSON 對象中,該函數返回在第一個級別找到的所有“鍵/值”對。
- 從 JSON 數組中,該函數返回數組的所有元素及其索引。
可以添加可選的 WITH 子句來提供顯式定義輸出結構的架構 。
選項 1 - 具有默認輸出的 OPENJSON
在不提供結果的顯式架構的情況下使用 OPENJSON 函數時(即,在 OPENJSON 之后不使用 WITH 子句),該函數將返回包含以下三列的表 :
- 輸入對象中屬性的名稱(或輸入數組中元素的索引) 。
- 屬性或數組元素的值 。
- 類型(例如,字符串、數字、布爾值、數組或對象) 。
OPENJSON 以單獨的行返回 JSON 對象的每個屬性或數組的每個元素 。
下面是使用具有默認架構(即不包含可選的 WITH 子句)的 OPENJSON 的快捷示例,該示例為 JSON 對象的每個屬性返回一行。
示例
DECLARE @json NVARCHAR(MAX)
SET @json='{"name":"John","surname":"Doe","age":45,"skills":["SQL","C#","MVC"]}';
SELECT *
FROM OPENJSON(@json);
結果
key | 值 | type |
---|---|---|
name | John | 1 |
surname | Doe | 1 |
age | 45 | 2 |
技能 | ["SQL","C#","MVC"] | 4 |
有關具有默認架構的 OPENJSON 的詳細信息
有關詳細信息和更多示例,請參閱使用具有默認架構的 OPENJSON (SQL Server)。
有關語法和用法的信息,請參閱 OPENJSON (Transact-SQL)下可用。
選項 2 - 具有顯式結構的 OPENJSON 輸出
如果使用 OPENJSON 函數的 WITH 子句指定結果的架構,該函數返回的表只包含 WITH 子句中定義的列。 在可選的 WITH 子句中,指定一組輸出列、列類型和每個輸出值的 JSON 源屬性的路徑 。 OPENJSON 循環訪問 JSON 對象的數組,讀取每一列的指定路徑上的值,並將值轉換為指定類型。
下面是使用具有 WITH 子句中顯式指定的輸出架構的 OPENJSON 快捷示例 。
示例
DECLARE @json NVARCHAR(MAX)
SET @json =
N'[
{
"Order": {
"Number":"SO43659",
"Date":"2011-05-31T00:00:00"
},
"AccountNumber":"AW29825",
"Item": {
"Price":2024.9940,
"Quantity":1
}
},
{
"Order": {
"Number":"SO43661",
"Date":"2011-06-01T00:00:00"
},
"AccountNumber":"AW73565",
"Item": {
"Price":2024.9940,
"Quantity":3
}
}
]'
SELECT * FROM
OPENJSON ( @json )
WITH (
Number varchar(200) '$.Order.Number' ,
Date datetime '$.Order.Date',
Customer varchar(200) '$.AccountNumber',
Quantity int '$.Item.Quantity'
)
結果
Number | Date | 客戶 | 數量 |
---|---|---|---|
SO43659 | 2011-05-31T00:00:00 | AW29825 | 1 |
SO43661 | 2011-06-01T00:00:00 | AW73565 | 3 |
此函數返回 JSON 數組的元素並將其格式化。
-
對於 JSON 數組中的每個元素, OPENJSON 會在輸出表中生成新的一行。 JSON 數組中的兩個元素將在返回的表中轉換為兩行。
-
對於通過使用
colName type json_path
語法指定的每一列,OPENJSON 將指定路徑上的每個數組元素中找到的值轉換為指定類型 。 在此示例中,Date
列的值獲取自路徑$.Order.Date
上的每個元素,並被轉換為日期時間值。
有關具有顯式架構的 OPENJSON 的詳細信息
有關詳細信息和更多示例,請參閱使用具有顯示架構的 OPENJSON (SQL Server)。
有關語法和用法的信息,請參閱 OPENJSON (Transact-SQL)下可用。
OPENJSON 要求兼容性級別 130
OPENJSON 函數僅在 兼容級別 130下可用。 如果數據庫兼容級別低於 130,SQL Server 將無法找到並運行 OPENJSON 函數 。 其他內置 JSON 函數在所有兼容級別均可用。
可以在 sys.databases
視圖或數據庫屬性中查看兼容級別。
可以使用以下命令更改數據庫的兼容級別:ALTER DATABASE <DatabaseName> SET COMPATIBILITY_LEVEL = 130