適用於: SQL Server 2016 (13.x) 及以後版本
Azure SQL Database Azure
SQL Managed Instance
Azure Synapse Analytics
SQL Analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
語法 JSON_VALUE 會從 JSON 字串擷取純量值。
若要從 JSON 字串擷取物件或陣列,而不是純量值,請參閱 JSON_QUERY。 如需 JSON_VALUE 及 JSON_QUERY 之間的差異資訊,請參閱比較 JSON_VALUE 與 JSON_QUERY。
Syntax
JSON_VALUE ( expression , path [ RETURNING data_type ] )
Arguments
expression
一種表達方式。 通常為變數的名稱或包含 JSON 文字的資料行。
如果在找到JSON_VALUE所識別的值之前,找到運算式中無效的 JSON,則函數會傳回錯誤。 如果找不到JSON_VALUE所識別的值,它會掃描整個文字,並在找到運算式中任何位置都無效的 JSON 時傳回錯誤。
path
指定要擷取之屬性的 JSON 路徑。 如需詳細資訊,請參閱 SQL 資料庫引擎中的 JSON 路徑運算式。
在 SQL Server 2017 (14.x) 和 Azure SQL Database 中,您可以提供變數作為 路徑的值。
如果 路徑 的格式無效, JSON_VALUE 則傳回錯誤。
data_type
傳回 SQL 類型中指定的值。 只有在輸入為 JSON 類型時才支援。 支援的 SQL 類型包括:tinyint、smallint、int、bigint、decimal、numeric、float、real、char、varchar、varchar(max)、nchar、nvarchar、nvarchar(max)、date、time、datetime2 和 datetimeoffset。
返回值
如果 RETURNING 不包含:
傳回 nvarchar(4000) 類型的單一文字值。 傳回值的定序與輸入運算式的定序相同。
如果值大於 4000 個字元:
- 在 lax 模式中,
JSON_VALUE會傳回NULL。 - 在 strict 模式中,
JSON_VALUE會傳回錯誤。
如果您必須傳回大於 4000 個字元的純量值,請使用
OPENJSON而非JSON_VALUE。 如需詳細資訊,請參閱 OPENJSON。- 在 lax 模式中,
如果 RETURNING 包含:
傳回 SQL 類型中指定的值。 支援的 SQL 類型包括:tinyint、smallint、int、bigint、decimal、numeric、float、real、char、varchar、varchar(max)、nchar、nvarchar、nvarchar(max)、date、time、datetime2 和 datetimeoffset。
JSON 函式的運作方式與 JSON 檔案儲存在 varchar、 nvarchar 或原生 json 數據類型相同。
Remarks
lax 模式和 strict 模式
請參考下列 JSON 文字:
DECLARE @jsonInfo AS NVARCHAR (MAX);
SET @jsonInfo = N'{
"info":{
"type":1,
"address":{
"town":"Bristol",
"county":"Avon",
"country/region":"England"
},
"tags":["Sport", "Water polo"]
},
"type":"Basic"
}';
下列表格會比較 lax 模式與 strict 模式中 JSON_VALUE 的行為。 如需選擇性路徑模式規格 (寬鬆或嚴格) 的詳細資訊,請參閱 SQL 資料庫引擎中的 JSON 路徑運算式。
| Path | lax 模式中的傳回值 | strict 模式中的傳回值 | 詳細資訊 |
|---|---|---|---|
| $ | NULL |
Error | 非純量值。 請改用 JSON_QUERY。 |
| $.info.type | N'1' | N'1' | N/a |
| $.info.address.town | N'Bristol' | N'Bristol' | N/a |
| $.info."address" | NULL |
Error | 非純量值。 請改用 JSON_QUERY。 |
| $.info.tags | NULL |
Error | 非純量值。 請改用 JSON_QUERY。 |
| $.info.type[0] | NULL |
Error | 非陣列。 |
| $.info.none | NULL |
Error | 財產不存在。 |
Examples
範例 1
下列範例會使用查詢結果中 town 和 state 的 JSON 屬性值。 由於 JSON_VALUE 會保留來源的定序,因此結果的排序次序取決於 jsonInfo 資料行定序而定。
Note
(此範例假設名為 的 Person.Person 表格包含 jsonInfo JSON 文字欄,且此欄具有先前討論鬆弛模式和嚴格模式中所示的結構。在範例資料庫中 AdventureWorks , Person 資料表實際上不包含 jsonInfo 資料行。
SELECT FirstName,
LastName,
JSON_VALUE(jsonInfo, '$.info.address.town') AS Town
FROM Person.Person
WHERE JSON_VALUE(jsonInfo, '$.info.address.state') LIKE 'US%'
ORDER BY JSON_VALUE(jsonInfo, '$.info.address.town');
範例 2
下列範例會將 JSON 屬性 town 的值擷取到區域變數中。
DECLARE @jsonInfo AS NVARCHAR (MAX);
DECLARE @town AS NVARCHAR (32);
SET @jsonInfo = N'{"info":{"address":[{"town":"Paris"},{"town":"London"}]}}';
SET @town = JSON_VALUE(@jsonInfo, '$.info.address[0].town'); -- Paris
SET @town = JSON_VALUE(@jsonInfo, '$.info.address[1].town'); -- London
範例 3
下列範例會建立以 JSON 屬性值為基礎的計算資料行。
CREATE TABLE dbo.Store
(
StoreID INT IDENTITY (1, 1) NOT NULL,
Address VARCHAR (500),
jsonContent NVARCHAR (4000),
Longitude AS JSON_VALUE(jsonContent, '$.address[0].longitude'),
Latitude AS JSON_VALUE(jsonContent, '$.address[0].latitude')
);
範例 4
下列範例會使用 從 JSON_VALUE JSON 陣列擷取值,並將該值傳回為日期類型值。
DECLARE @j AS JSON = '[1, 1.3333, true, "a", "1", "2025-01-01"]';
SELECT JSON_VALUE(@j, '$[5]' RETURNING date) AS date_value;
date_value
--------
2025-01-01