共用方式為


JSON 資料類型 (預覽版)

適用於: Azure SQL 資料庫 Azure SQL 受控執行個體

以原生二進位格式儲存 JSON 文件的全新原生 json 資料類型。

json 類型提供 JSON 文件的高逼真度儲存體,已針對簡易查詢和操作最佳化,而且提供儲存於 varcharnvarchar 之 JSON 資料沒有的下列優點:

  • 更有效率的讀取,因為已將文件剖析
  • 更有效率的寫入,因為查詢可以更新個別值,而不需要存取整份文件
  • 更有效率的儲存體,已針對壓縮進行最佳化
  • 與現有程式碼的相容性沒有變更

json 類型使用 UTF-8 編碼在內部儲存資料,Latin1_General_100_BIN2_UTF8。 此行為符合 JSON 規格。

如需查詢 JSON 數據的詳細資訊,請參閱 SQL Server 中的 JSON 數據。

範例語法

json 類型的使用語法類似於資料表中所有其他 SQL Server 資料類型。

column_name JSON [NOT NULL | NULL] [CHECK(constraint_expression)] [DEFAULT(default_expression)]

json 類型可用於 CREATE TABLE 陳述式中包含的資料欄定義,例如:

CREATE TABLE Orders (order_id int, order_details JSON NOT NULL);

條件約束可指定為資料行定義的一部分,例如:

CREATE TABLE Orders (order_id int, order_details JSON NOT NULL
   CHECK (JSON_PATH_EXISTS(order_details, '$.basket') = 1
);

功能可用性

JSON 支援最初是在 SQL Server 2016 (13.x) 中引進的,其中大部分是以 JSON 函數的形式。 新的原生 json 類型於 2024 年引進,最早出現於 Azure SQL 平台。

json 適用於所有資料庫相容性層級。

注意

JSON 數據類型目前為 Azure SQL 資料庫 和 Azure SQL 受控執行個體 預覽版(使用 Always-up-to-date 更新原則設定)。

函數支援

所有 JSON 函數都支援 json 類型,且無需變更程式碼,使用方式也沒有差異。

如需 JSON 函數的完整清單,請參閱 JSON 函數

索引數

JSON 資料沒有特殊的索引類型。

json 類型不能當做 CREATE INDEX 陳述式中的索引鍵資料行使用。 不過,json 資料行可指定為索引定義中的內含資料行。 此外,json 資料行可以出現在已篩選索引的 WHERE 子句中。

轉換

使用 CASTCONVERT,實現從 json 類型明確轉換為 charncharvarcharnvarchar 類型。 不允許所有隱含轉換,類似於 xml 的行為。 同樣地,只有 charncharvarcharnvarchar 可以明確轉換為 json 類型。

json 類型不能搭配 sql_variant 使用,或指派至 sql_variant 變數或資料行。 這項限制類似於 varchar(max)varbinary(max)nvarchar(max)xml 和 CLR 基底資料型別。

如需詳細資訊,請參閱資料類型轉換

相容性

json 類型可當做使用者定義函數中的參數或傳回型別,或預存程序的參數。 json 類型與觸發程序和檢視相容。

目前,bcp 工具的原生格式包含 varcharnvarchar 格式的 json 文件。 您必須指定格式檔案,才能指定 json 資料類型資料行。

不允許針對 json 類型使用 CREATE TYPE 建立別名資料型別。 這與 xml 類型相同。

搭配 JSON 類型使用 SELECT ... INTO,會建立 JSON 類型的資料表。

限制

  • CAST ( ... AS JSON) 的行為會傳回 json 類型,但 sp_describe_first_result_set 系統預存程序未正確傳回 json 資料類型。 因此,許多資料存取用戶端和驅動程式都可查看 varchar 或 nvarchar 資料類型。

    • 目前,TDS >= 7.4 (使用 UTF-8) 支援可查看 varchar(max) (使用 Latin_General_100_bin2_utf8)。
    • 目前,TDS < 7.4 支援可查看 nvarchar(max) (使用資料庫定序)。
  • 目前,OPENJSON() 函數不接受 json 類型,目前為隱含轉換。 首先,明確轉換為 nvarchar(max)