共用方式為


SET IDENTITY_INSERT (Transact-SQL)

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

允許將明確的值插入資料表的識別欄位中。

Transact-SQL 語法慣例

語法

SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }

引數

database_name

指定之數據表所在的資料庫名稱。

schema_name

數據表所屬的架構名稱。

table_name

具有標識列的數據表名稱。

備註

在任何時間,工作階段中只有一個資料表可以將 IDENTITY_INSERT 屬性設定為 ON。 如果數據表已經將這個屬性設定為 ON,而針對另一個數據表發出 SET IDENTITY_INSERT ON 語句,SQL Server 會傳回錯誤訊息,指出 SET IDENTITY_INSERT 已經 ON,並報告已設定 ON 的數據表。

如果輸入的值大於資料表目前的識別值,SQL Server 會自動使用新插入的值作為目前的識別值。

SET IDENTITY_INSERT 的設定是在運行時間設定,而不是在剖析時間設定。

權限

用戶必須擁有數據表,或擁有數據表 ALTER 許可權。

範例

下列範例會建立含識別欄位的資料表,且會顯示如何利用 SET IDENTITY_INSERT 設定來填滿 DELETE 陳述式所造成的識別值的間距。

USE AdventureWorks2022;
GO

建立工具數據表。

CREATE TABLE dbo.Tool
(
    ID INT IDENTITY NOT NULL PRIMARY KEY,
    Name VARCHAR (40) NOT NULL
);
GO

將值插入 products 數據表。

INSERT INTO dbo.Tool (Name)
VALUES ('Screwdriver'),
    ('Hammer'),
    ('Saw'),
    ('Shovel');
GO

在識別值中建立間距。

DELETE dbo.Tool
WHERE Name = 'Saw';
GO

SELECT *
FROM dbo.Tool;
GO

嘗試插入 3 的明確標識碼值。

INSERT INTO dbo.Tool (ID, Name)
VALUES (3, 'Garden shovel');
GO

先前的 INSERT 程式代碼應該會傳回下列錯誤:

An explicit value for the identity column in table 'AdventureWorks2022.dbo.Tool' can only be specified when a column list is used and IDENTITY_INSERT is ON.

IDENTITY_INSERT 設定為 ON

SET IDENTITY_INSERT dbo.Tool ON;
GO

嘗試插入 3 的明確標識碼值。

INSERT INTO dbo.Tool (ID, Name)
VALUES (3, 'Garden shovel');
GO

SELECT *
FROM dbo.Tool;
GO

卸除工具數據表。

DROP TABLE dbo.Tool;
GO