JSON_VALUE (Transact-SQL)

適用於:SQL Server 2016 (13.x) 和更新版本Azure SQL DatabaseAzure SQL 受控執行個體Azure Synapse Analytics

從 JSON 字串擷取純量值。

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

Transact-SQL 語法慣例

語法

JSON_VALUE ( expression , path )  

引數

expression
運算式。 通常為變數的名稱或包含 JSON 文字的資料行。

JSON_VALUE 在找到 path 識別的值之前,先找到 expression 中無效的 JSON,函式便會傳回錯誤。 如果 JSON_VALUE 找不到 path 所識別的值,則會掃描整個文字,並在 expression 中任何一處找到無效的 JSON 時傳回錯誤。

path
指定要擷取之屬性的 JSON 路徑。 如需詳細資訊,請參閱 JSON 路徑運算式 (SQL Server)

在 SQL Server 2017 (14.x) 和 Azure SQL Database 中,您可以提供變數作為 path 的值。

如果 path 的格式無效,則 JSON_VALUE 會傳回錯誤。

傳回值

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

如果值大於 4000 個字元:

  • 在 lax 模式中,JSON_VALUE 會傳回 Null。

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

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

備註

lax 模式和 strict 模式

請參考下列 JSON 文字:

DECLARE @jsonInfo NVARCHAR(MAX)

SET @jsonInfo=N'{  
     "info":{    
       "type":1,  
       "address":{    
         "town":"Bristol",  
         "county":"Avon",  
         "country":"England"  
       },  
       "tags":["Sport", "Water polo"]  
    },  
    "type":"Basic"  
 }'  

下列表格會比較 lax 模式與 strict 模式中 JSON_VALUE 的行為。 如需選擇性路徑模式規格 (lax 或 strict) 的詳細資訊,請參閱 JSON 路徑運算式 (SQL Server)

Path lax 模式中的傳回值 strict 模式中的傳回值 其他資訊
$ NULL 錯誤 非純量值。

請改用 JSON_QUERY
$.info.type N'1' N'1' N/a
$.info.address.town N'Bristol' N'Bristol' N/a
$.info."address" NULL 錯誤 非純量值。

請改用 JSON_QUERY
$.info.tags NULL 錯誤 非純量值。

請改用 JSON_QUERY
$.info.type[0] NULL 錯誤 非陣列。
$.info.none NULL 錯誤 屬性不存在。

範例

範例 1

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

注意

(這個範例假設一個名為 Person.Person 的資料表,其中包含 JSON 文字的 jsonInfo 資料行,且該資料行的結構如先前 lax 模式和 strict 模式的說明中所示。在 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 NVARCHAR(MAX)
DECLARE @town 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')
 )

請參閱

JSON 路徑運算式 (SQL Server)
JSON 資料 (SQL Server)