共用方式為


JSON_VALUE (Transact-SQL)

適用於: SQL Server 2016 (13.x) 及以後版本 Azure SQL Database AzureSQL Managed InstanceAzure Synapse AnalyticsSQL Analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL database in Microsoft Fabric

語法 JSON_VALUE 會從 JSON 字串擷取純量值。

若要從 JSON 字串擷取物件或陣列,而不是純量值,請參閱 JSON_QUERY。 如需 JSON_VALUEJSON_QUERY 之間的差異資訊,請參閱比較 JSON_VALUE 與 JSON_QUERY

Transact-SQL 語法慣例

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 類型包括:tinyintsmallintint、bigintdecimalnumericfloatrealcharvarcharvarchar(max)ncharnvarcharnvarchar(max)datetime、datetime2datetimeoffset

返回值

如果 RETURNING 不包含:

  • 傳回 nvarchar(4000) 類型的單一文字值。 傳回值的定序與輸入運算式的定序相同。

  • 如果值大於 4000 個字元:

    • 在 lax 模式中,JSON_VALUE 會傳回 NULL
    • 在 strict 模式中,JSON_VALUE 會傳回錯誤。

    如果您必須傳回大於 4000 個字元的純量值,請使用 OPENJSON 而非 JSON_VALUE。 如需詳細資訊,請參閱 OPENJSON。

如果 RETURNING 包含:

傳回 SQL 類型中指定的值。 支援的 SQL 類型包括:tinyintsmallintint、bigintdecimalnumericfloatrealcharvarcharvarchar(max)ncharnvarcharnvarchar(max)datetime、datetime2datetimeoffset

JSON 函式的運作方式與 JSON 檔案儲存在 varcharnvarchar 或原生 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

下列範例會使用查詢結果中 townstate 的 JSON 屬性值。 由於 JSON_VALUE 會保留來源的定序,因此結果的排序次序取決於 jsonInfo 資料行定序而定。

Note

(此範例假設名為 的 Person.Person 表格包含 jsonInfo JSON 文字欄,且此欄具有先前討論鬆弛模式和嚴格模式中所示的結構。在範例資料庫中 AdventureWorksPerson 資料表實際上不包含 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