下面是 JSON 文本的示例
[{
"name": "John",
"skills": ["SQL", "C#", "Azure"]
}, {
"name": "Jane",
"surname": "Doe"
}]
通過使用 SQL Server 內置函數和運算符,你可以對 JSON 文本執行以下操作:
- 分析 JSON 文本和讀取或修改值。
- 將 JSON 對象數組轉換為表格式。
- 在轉換后的 JSON 對象上運行任意 Transact-SQL 查詢。
- 將 Transact-SQL 查詢的結果設置為 JSON 格式。
在以下示例中,查詢同時使用表中的關系數據和 JSON 數據(存儲在名為 jsonCol
的列中):
SELECT Name,Surname,
JSON_VALUE(jsonCol,'$.info.address.PostCode') AS PostCode,
JSON_VALUE(jsonCol,'$.info.address."Address Line 1"')+' '
+JSON_VALUE(jsonCol,'$.info.address."Address Line 2"') AS Address,
JSON_QUERY(jsonCol,'$.info.skills') AS Skills
FROM People
WHERE ISJSON(jsonCol)>0
AND JSON_VALUE(jsonCol,'$.info.address.Town')='Belgrade'
AND Status='Active'
ORDER BY JSON_VALUE(jsonCol,'$.info.address.PostCode')
將 JSON 集合轉換為行集
在 SQL Server 中查詢 JSON 不需要自定義查詢語言。 可以使用標准的 T-SQL 查詢 JSON 數據。 如果必須基於 JSON 數據創建查詢或報表,可以通過調用 OPENJSON 行集函數,輕松地將 JSON 數據轉換為行與列 。 有關詳細信息,請參閱用 OPENJSON 將 JSON 數據轉換為行和列 (SQL Server)。
以下示例調用 OPENJSON,並且將 @json
變量中存儲的對象數組轉換為可使用標准 SQL SELECT 語句查詢的行集 :
DECLARE @json NVARCHAR(MAX)
SET @json =
N'[
{ "id" : 2,"info": { "name": "John", "surname": "Smith" }, "age": 25 },
{ "id" : 5,"info": { "name": "Jane", "surname": "Smith" }, "dob": "2005-11-04T12:00:00" }
]'
SELECT *
FROM OPENJSON(@json)
WITH (id int 'strict $.id',
firstName nvarchar(50) '$.info.name', lastName nvarchar(50) '$.info.surname',
age int, dateOfBirth datetime2 '$.dob')
OPENJSON 將 JSON 對象的數組轉換為表,其中每個對象表示為一行,鍵/值對將作為單元返回。 輸出遵循下列規則:
- OPENJSON 將 JSON 值轉換為 WITH 子句中指定的類型 。
- OPENJSON 可以處理規則的鍵/值對以及分層組織的對象。
- 不需要返回 JSON 文本中包含的所有字段。
- 如果 JSON 值不存在,OPENJSON 返回 NULL 值。
- 可以選擇在類型規范后指定一個路徑,以引用嵌套屬性或按不同的名稱引用屬性。
- 路徑中可選的 strict 前綴指定 JSON 文本中必須存在指定屬性的值。
SELECT id, firstName AS "info.name", lastName AS "info.surname", age, dateOfBirth as dob
FROM People
FOR JSON PATH
應用程序池:” FOR JSON 子句將 SQL 結果的格式設置為 JSON 文本,該格式可提供給識別 JSON 的任何應用。 PATH 選項在 SELECT 子句中使用以點分隔的別名,以嵌套查詢結果中的對象。
[{
"id": 2,
"info": {
"name": "John",
"surname": "Smith"
},
"age": 25
}, {
"id": 5,
"info": {
"name": "Jane",
"surname": "Smith"
},
"dob": "2005-11-04T12:00:00"
}]