You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:15:05