SET IDENTITY_INSERT (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics
允许将显式值插入到表的标识列中。
语法
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
将值插入产品表中。
INSERT INTO dbo.Tool (Name)
VALUES ('Screwdriver'),
('Hammer'),
('Saw'),
('Shovel');
GO
在标识值中创建空白。
DELETE dbo.Tool
WHERE Name = 'Saw';
GO
SELECT *
FROM dbo.Tool;
GO
尝试插入 3 的显式 ID 值。
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 的显式 ID 值。
INSERT INTO dbo.Tool (ID, Name)
VALUES (3, 'Garden shovel');
GO
SELECT *
FROM dbo.Tool;
GO
放置工具表。
DROP TABLE dbo.Tool;
GO