SQL Server 2008 R2 for SET IDENTITY_INSERT 上的奇怪错误(消息 8107)

Weird error (Msg 8107) on SQL Server 2008 R2 for SET IDENTITY_INSERT

我正在尝试 运行 这段代码:

SET IDENTITY_INSERT [dbo].[FIN_REP_REPORT_LOG] ON
SET IDENTITY_INSERT [dbo].[REPORT_LOG_SEQ] ON
INSERT INTO [dbo].[REPORT_LOG_SEQ] ([sqVal]) VALUES (1000000);

我收到此错误:

供参考:我将 FIN_REP_REPORT_LOG 称为 'TABLE A',将 REPORT_LOG_SEQ 称为 'TABLE B'。

REPORT_LOG_SEQ table 上的第 2 个 IDENTITY_INSERT 语句之后的错误消息甚至不相关!

SET IDENTITY_INSERT [TABLE B] ON
--Msg 8107, Level 16, State 1, Line 1
--IDENTITY_INSERT is already ON for table [TABLE A]. 
--Cannot perform SET operation for table [TABLE B].

然后 INSERT INTO 语句因 [TABLE B]!

而失败
INSERT INTO [TABLE B] ([sqVal])
VALUES (1000000)
--Msg 544, Level 16, State 1, Line 1
--Cannot insert explicit value for identity column in table [TABLE B] when IDENTITY_INSERT is set to OFF.

[TABLE B] 上的 SET 操作没有发生,因此 INSERT 操作失败。

我想知道的是:

  1. 为什么第二个 SET IDENTITY_INSERT 语句失败?
  2. 为什么错误消息甚至引用不相关的 [TABLE A]?
  3. 我该如何解决?

场景:

仅供参考: Table FIN_REP_REPORT_LOG (TABLE A) 的定义:

CREATE TABLE [dbo].[FIN_REP_REPORT_LOG](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [REPORT_NAME] [nvarchar](50) NOT NULL,
    [EMPLOYEE_NUMBER] [nvarchar](10) NULL,
    [PARAMS] [nvarchar](1000) NULL,
    [START_DATE] [datetime2](0) NOT NULL,
    [END_DATE] [datetime2](0) NULL
) ON [PRIMARY]

REPORT_LOG_SEQ (TABLE B) 的 table 定义:

CREATE TABLE [dbo].[REPORT_LOG_SEQ](
    [sqVal] [bigint] IDENTITY(1000000,1) NOT NULL
) ON [PRIMARY]

任何帮助(甚至线索)将不胜感激。 :)

来自 here 它说:

IDENTITY_INSERT can only be set to on for one table in a database at a time. It must be turned off, before it can be turned on again for a different table.

1 : 它失败了,因为数据库中已经有一个 table 并且 IDENTITY_INSERT 打开了。

2 : table 已经 IDENTITY_INSERT 的错误状态。

3 : 似乎这段代码在开发环境中根本不是 运行。 尝试在 SSMS 的新查询编辑器中 运行 下面的代码,看看你是否收到错误。 (替换 table 名称)

SET IDENTITY_INSERT [dbo].[Your tableName] ON
SET IDENTITY_INSERT [dbo].[Your tableName2] ON

我相信你会得到这个错误。这应该澄清环境之间的差异。不要忘记运行测试后关闭电源以避免调试时出现问题。

SET IDENTITY_INSERT [dbo].[Your tableName] OFF

从那里你将不得不重构代码以在 IDENTITY_INSERT 开启时只有一个 table。