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 操作失败。
我想知道的是:
- 为什么第二个 SET IDENTITY_INSERT 语句失败?
- 为什么错误消息甚至引用不相关的 [TABLE A]?
- 我该如何解决?
场景:
- 我运行一次一行地编写此代码!
- 我正在使用 SQL Server 2008 R2
- 代码在 "dev" 和 "test" 服务器上运行良好,但失败
在生产服务器上。
- 生产服务器的'Compatibility Level'是100级。
"dev" 和 "test" 服务器 80。
- 它们在所讨论的 table 之间没有相互依赖关系。
- 我不是DBA。我只能运行 "dev" 上的代码。 DBA 必须 运行
"Test" 和 "Prod".
上的代码
- DBA跟我一样难过
仅供参考:
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。
我正在尝试 运行 这段代码:
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 操作失败。
我想知道的是:
- 为什么第二个 SET IDENTITY_INSERT 语句失败?
- 为什么错误消息甚至引用不相关的 [TABLE A]?
- 我该如何解决?
场景:
- 我运行一次一行地编写此代码!
- 我正在使用 SQL Server 2008 R2
- 代码在 "dev" 和 "test" 服务器上运行良好,但失败 在生产服务器上。
- 生产服务器的'Compatibility Level'是100级。 "dev" 和 "test" 服务器 80。
- 它们在所讨论的 table 之间没有相互依赖关系。
- 我不是DBA。我只能运行 "dev" 上的代码。 DBA 必须 运行 "Test" 和 "Prod". 上的代码
- DBA跟我一样难过
仅供参考: 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。