JSON 資料類型 (預覽版)
適用於: Azure SQL 資料庫 Azure SQL 受控執行個體
以原生二進位格式儲存 JSON 文件的全新原生 json 資料類型。
json 類型提供 JSON 文件的高逼真度儲存體,已針對簡易查詢和操作最佳化,而且提供儲存於 varchar 或 nvarchar 之 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
子句中。
轉換
使用 CAST
或 CONVERT
,實現從 json 類型明確轉換為 char、nchar、varchar 與 nvarchar 類型。 不允許所有隱含轉換,類似於 xml 的行為。 同樣地,只有 char、nchar、varchar 與 nvarchar 可以明確轉換為 json 類型。
json 類型不能搭配 sql_variant 使用,或指派至 sql_variant 變數或資料行。 這項限制類似於 varchar(max)、varbinary(max)、nvarchar(max)、xml 和 CLR 基底資料型別。
如需詳細資訊,請參閱資料類型轉換。
相容性
json 類型可當做使用者定義函數中的參數或傳回型別,或預存程序的參數。 json 類型與觸發程序和檢視相容。
目前,bcp 工具的原生格式包含 varchar 或 nvarchar 格式的 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) (使用資料庫定序)。
- 目前,TDS >= 7.4 (使用 UTF-8) 支援可查看 varchar(max) (使用
目前,
OPENJSON()
函數不接受 json 類型,目前為隱含轉換。 首先,明確轉換為 nvarchar(max)。