如何在SQL Server中判断IDENTITY_INSERT的开启或关闭状态?
检测SQL Server中IDENTITY_INSERT的当前状态
在SQL Server里,IDENTITY_INSERT是会话级的设置,sys.identity_columns仅用于确认表是否包含标识列,无法获取当前会话中该设置的状态。针对你的需求,有两种可靠的处理方式:
方法1:用TRY/CATCH避免报错终止
直接将SET IDENTITY_INSERT ... OFF语句包裹在TRY/CATCH块中,捕获并忽略“已处于OFF状态”的错误,这样即使重复执行也不会终止运行:
BEGIN TRY SET IDENTITY_INSERT YourTableName OFF; END TRY BEGIN CATCH -- 错误号2539对应“无法将IDENTITY_INSERT设置为OFF,因为它已经是OFF” IF ERROR_NUMBER() = 2539 PRINT '提示:IDENTITY_INSERT 已处于OFF状态,无需重复执行'; -- 可根据需要添加其他错误处理逻辑 END CATCH
方法2:查询会话状态(针对特定表)
如果需要预先检测特定表的IDENTITY_INSERT状态,可以通过查询当前会话的执行上下文来判断。由于IDENTITY_INSERT在一个会话中只能对一个表开启,你可以结合动态管理视图查询:
DECLARE @TableName NVARCHAR(128) = N'YourTableName'; DECLARE @FullTableName NVARCHAR(256) = QUOTENAME(OBJECT_SCHEMA_NAME(OBJECT_ID(@TableName))) + N'.' + QUOTENAME(@TableName); SELECT CASE WHEN EXISTS ( SELECT 1 FROM sys.dm_exec_sessions s JOIN sys.dm_exec_connections c ON s.session_id = c.session_id CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t WHERE s.session_id = @@SPID AND t.text LIKE N'%SET IDENTITY_INSERT ' + @FullTableName + N' ON%' ) THEN 'ON' ELSE 'OFF' END AS [IdentityInsertStateForTable]
注意:这种方法依赖于最近执行的SQL文本匹配,若通过动态SQL开启IDENTITY_INSERT,可能无法准确捕获,因此TRY/CATCH的方式更稳定。
内容的提问来源于stack exchange,提问作者Maury Markowitz
相关产品推荐
相关产品推荐

