JSON 數據類型

適用於: SQL Server 2025 (17.x) Azure SQL Database AzureSQL Managed InstanceSQL database in Microsoft Fabric

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 ) ]

在陳述句中包含的CREATE TABLE欄位定義中使用 json 資料型別。 例如:

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 資料型別可在 Azure SQL Database、Azure SQL 受控執行個體 及 SQL Server 2025 (17.x) 中取得。

欲了解更多關於 SQL Server 2025(17.x)中 JSON 支援的資訊,請參閱 SQL Server 2025 的關鍵 JSON 功能。

json 資料類型可在所有資料庫相容性層級下使用。

Note

json 資料型態與 JSON 索引通常可在 2025 SQL Server(17.x)、Azure SQL Database、Azure SQL 受控執行個體(SQL Server 2025 或 Always-up-to-date更新政策,以及 SQL 資料庫Microsoft Fabric提供。

修改方法

json 資料類型支援該modify方法。 用來 modify 更改存放在欄位中的 JSON 文件。 該 modify 方法包含在可能的情況下對資料進行原地修改的優化。 這是修改 JSON 欄位文件的首選方式。

對於 JSON 字串,如果新值長度與現有值相同或更短,方法可以即時修改資料。

對於 JSON 數字,如果新值類型相同或符合現有值的範圍,方法可以修改原地資料。

DROP TABLE IF EXISTS JsonTable;

CREATE TABLE JsonTable
(
    id INT PRIMARY KEY,
    d JSON
);

INSERT INTO JsonTable
(
    id,
    d
)
VALUES (1, '{"a":1, "b":"abc", "c":true}');

UPDATE JsonTable
SET d.modify('$.a', 14859)
WHERE id = 1;

UPDATE JsonTable
SET d.modify('$.b', 'def')
WHERE id = 1;

有效資料

json 資料型 別的輸入必須是 JSON 物件或 JSON 陣列。 標量、布林值和 NULL 數值都不支援。 JSON 資料型別符合 IETF RFC 4627,該規範僅允許 JSON 物件或陣列。

使用 ISJSON 函式來測試字串是否包含有效的 JSON。 若無型別限制,頂 ISJSON 層僅接受 JSON 物件或陣列,與 JSON 資料型別相同。 VALUE型別約束接受頂層的任何 JSON 值,包括標量值,依照 IETF RFC 8259 的規定。 ARRAY、 OBJECT、 SCALAR 和 型別約束只接受該型態。

例如:

DECLARE @true AS JSON = 'true'; -- invalid
DECLARE @false AS JSON = 'false'; -- invalid
DECLARE @number AS JSON = '1234.56'; -- invalid
DECLARE @string AS JSON = '"contoso"'; -- invalid
DECLARE @null AS JSON = 'null'; -- invalid

DECLARE @null AS JSON = NULL; -- valid
DECLARE @object AS JSON = '{}'; -- valid
DECLARE @array AS JSON = '[]'; -- valid

功能支持

所有 JSON 函式都支援 JSON 資料型別,無需修改程式碼。

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

Indexes

json 欄位可以是索引定義中的包含欄位,或出現在WHERE篩選索引的子句中。 JSON 欄位不能用作標準索引中的鍵欄位。

如需詳細資訊,請參閱 CREATE INDEX。

在 Azure SQL Database、Azure SQL 受控執行個體、SQL Server 2025(17.x)以及 Microsoft Fabric 中的 SQL 資料庫中,你可以建立一個 JSON 索引,以優化存取 JSON 文件中值的查詢。

如需詳細資訊,請參閱 CREATE JSON INDEX。

Conversion

從 json 轉換到 char、 nchar、 varchar 和 nvarchar 必須是明確的。 使用 CAST 或 CONVERT。

從 char、 nchar、 varchar、 nvarchar 和 向量 轉為 json 可以是隱含的,也可以是隱含的。 從 json 轉換到 vector 也可以是隱含或顯式的。

不允許在 json 和所有其他資料型態之間轉換。

你要轉換成 json 的值必須是 JSON 物件或 JSON 陣列。 JSON 標量,例如 1、 "abc"、 true或 null,會造成錯誤 13609。 空字串也會造成錯誤 13609。 如果物件有重複的鍵, json 會保留第一個值,丟棄其他值。 沒有錯誤發生。

從 JSON 轉換成字串型別時,回傳的 JSON 文字不會留白。 若目標長度對 JSON 文字來說過短,則會發生錯誤 13639。 價值沒有被截斷。

json 資料類型無法與 sql_variant 類型搭配使用,也無法指派給sql_variant變數或資料行。 此限制類似於varchar(max)、varbinary(max)、nvarchar(max)、xml及基於CLR的資料型態。

您可以使用 將現有的列 (例如 varchar(max) ) 轉換為 ALTER TABLE 。 與 xml 資料類型類似,您無法使用 將 ALTER TABLE 資料行轉換為任何字串或二進位類型。

如需詳細資訊,請參閱資料類型轉換 (資料庫引擎)。

數值精度

當你從 char、nchar、varchar 或 nvarchar 轉成 json 時,包含 JSON 數字的 JSON 文字可以根據數字格式進行四捨五入。

如果你需要保留精確度,可以把 JSON 數字指定為小數值。 同樣地,如果你需要保留 JSON 文件的文字表示,請將 JSON 文件儲存為字串資料型別。

Compatibility

你可以將 json 資料型別用作使用者自訂函式中的參數或回傳型別,或作為儲存程序的參數。 json 類型與觸發程式和檢視相容。

目前,BCP 工具的原生格式以 varchar 或 nvarchar 來表示 json 資料。 您必須指定格式檔案才能指定 json 資料行。

你無法為 json 資料型別建立別 CREATE TYPE名型別。 此行為與 xml 資料類型相同。

搭配 SELECT ... INTO 資料類型使用 會建立具有 json 類型的表格。

Limitations

CAST 並 CONVERT 如預期回傳 JSON 資料型別。

驅動程式限制

如果驅動程式支援 JSONSUPPORT TDS 功能擴充,sp_describe_first_result_set系統儲存程序會正確回傳 json 資料型別。 不支援此擴充的驅動程式請參考 varchar 或 nvarchar 。

支援 SqlClient (>= 6.0) 與 JDBC (>= 13.2.0) JSONSUPPORT。 例如,最新版本的 SQL Server Management Studio(SSMS)使用最新的 SqlClient 驅動程式,並正確回報結果集中繼資料中的 json 型別。

  • 若無 JSONSUPPORT,TDS >= 7.4(使用UTF-8)報告 varchar(max), 且 Latin1_General_100_BIN2_UTF8。
  • 若無 JSONSUPPORT,TDS < 7.4 會報告 nvarchar(max) 並進行資料庫彙整。

尺寸限制

儲存體中 JSON 資料的大小限制:

領域 限度
JSON 資料類型大小 (二進位) 最多可達 2 GB
唯一索引鍵數目 最多可達32,000人
每個按鍵字串大小 7,998 位元組
每個字串值大小 536,870,911 位元組
一個物件中的屬性數目 最多可達65,535人
一個陣列中的元素數 最多可達65,535人
JSON 文件中的巢狀層級數目 128