【问题标题】:Weird error (Msg 8107) on SQL Server 2008 R2 for SET IDENTITY_INSERTSET IDENTITY_INSERT 的 SQL Server 2008 R2 上的奇怪错误 (Msg 8107)
【发布时间】:2015-09-30 08:31:27
【问题描述】:

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

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 表上的第二个 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. 我可以做些什么来解决它?

场景:

  • 我一次只运行一行代码!
  • 我使用的是 SQL Server 2008 R2
  • 代码在“开发”和“测试”服务器中运行良好,但失败 在生产服务器上。
  • 生产服务器的“兼容级别”为 100。它的级别 “开发”和“测试”服务器为 80。
  • 它们在相关表之间没有相互依赖关系。
  • 我不是 DBA。我只能在“dev”上运行代码。 DBA 必须运行 “测试”和“产品”上的代码。
  • DBA 和我一样难过。

仅供参考: FIN_REP_REPORT_LOG(表 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) 的表定义:

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

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

【问题讨论】:

  • 我认为您一次只能为一张表设置身份插入。看起来你正试图同时为两张桌子做这件事
  • 你已经为表 A 提供 IDENTITY_INSERT ON 并且你再次在做表 B 只是为表 A 关闭并为表 B 运行
  • 可能就是这样。在开发和测试中,我们先做一张桌子,然后再做另一张。

标签: sql-server sql-server-2008 tsql sql-server-2008-r2 runtime-error


【解决方案1】:

来自here 它说:

IDENTITY_INSERT 一次只能为数据库中的一个表设置为 on。必须先将其关闭,然后才能为其他表再次打开。

1 : 失败是因为数据库中已经有一个表 IDENTITY_INSERT 开启。

2 : 表 IDENTITY_INSERT 已经开启的错误状态。

3: 似乎这段代码根本没有在开发环境中运行。 尝试在 SSMS 的新查询编辑器中运行下面的代码,看看是否出现错误。 (替换表名)

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

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

SET IDENTITY_INSERT [dbo].[Your tableName] OFF

从那里您将不得不重构代码,以便在启用 IDENTITY_INSERT 的情况下一次只有一个表。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多