【发布时间】: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 操作失败。
我想知道的是:
- 为什么第二个 SET IDENTITY_INSERT 语句失败?
- 为什么错误消息甚至引用了不相关的 [TABLE A]?
- 我可以做些什么来解决它?
场景:
- 我一次只运行一行代码!
- 我使用的是 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