JSON_QUERY (Transact-SQL)

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

從 JSON 字串擷取物件或陣列。

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

Transact-SQL 語法慣例

語法

JSON_QUERY ( expression [ , path ] )  

引數

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

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

path
指定要擷取之物件或陣列的 JSON 路徑。

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

JSON 路徑可為剖析指定 lax 或 strict 模式。 若您未指定剖析模式,預設會使用 lax 模式。 如需詳細資訊,請參閱 JSON 路徑運算式 (SQL Server)

path 的預設值為 '$'。 如此一來,若您未提供 path 的值,JSON_QUERY 會傳回輸入的 expression

path 的格式無效,JSON_QUERY 便會傳回錯誤。

傳回值

傳回型別為 nvarchar(max) 的 JSON 片段。 傳回值的定序與輸入運算式的定序相同。

若值並非物件或陣列:

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

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

備註

lax 模式和 strict 模式

請參考下列 JSON 文字:

{
   "info": {
      "type": 1,
      "address": {
         "town": "Cheltenham",
         "county": "Gloucestershire",
         "country": "England"
      },
      "tags": ["Sport", "Water polo"]
   },
   "type": "Basic"
} 

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

Path lax 模式中的傳回值 strict 模式中的傳回值 其他資訊
$ 傳回完整的 JSON 文字。 傳回完整的 JSON 文字。 N/a
$.info.type NULL 錯誤 並非物件或陣列。

請改為使用 JSON_VALUE
$.info.address.town NULL 錯誤 並非物件或陣列。

請改為使用 JSON_VALUE
$.info."address" N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' N/a
$.info.tags N'[ "Sport", "Water polo"]' N'[ "Sport", "Water polo"]' N/a
$.info.type[0] NULL 錯誤 非陣列。
$.info.none NULL 錯誤 屬性不存在。

搭配 FOR JSON 使用 JSON_QUERY

JSON_QUERY 會傳回有效的 JSON 片段。 因此,FOR JSON 不會在 JSON_QUERY 的傳回值中逸出特殊字元。

若您使用 FOR JSON 傳回結果,並且在其中包含已經是 JSON 格式的資料 (在資料行中或運算式的結果),請使用不具有 path 參數的 JSON_QUERY 來包裝 JSON 資料。

範例

範例 1

下列範例示範如何在查詢結果中傳回來自 CustomFields 資料行的 JSON 片段。

SELECT PersonID,FullName,
  JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People

範例 2

下列範例示範如何在 FOR JSON 子句的輸出中包含 JSON 片段。

SELECT StockItemID, StockItemName,
         JSON_QUERY(Tags) as Tags,
         JSON_QUERY(CONCAT('["',ValidFrom,'","',ValidTo,'"]')) ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH

另請參閱