IDENTITY_INSERT 设置为 OFF - 如何将其打开?

Posted

技术标签:

【中文标题】IDENTITY_INSERT 设置为 OFF - 如何将其打开?【英文标题】:IDENTITY_INSERT is set to OFF - How to turn it ON? 【发布时间】:2011-03-07 22:56:01 【问题描述】:

我有一个已删除的文件存档数据库,其中存储了已删除文件的 ID,我希望管理员能够恢复该文件(以及用于链接文件的相同 ID)。我不想将 identity_insert 从整个表中删除,因为加一效果很好。在我插入TBL_Content 存储过程中,我有这样的东西

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 
...insert command...
SET IDENTITY_INSERT tbl_content OFF

但我一直收到同样的错误:

无法为表中的标识列插入显式值 IDENTITY_INSERT 设置为 OFF 时的“TBL_Content”。

有什么帮助吗?

【问题讨论】:

【参考方案1】:

您是否应该在存储过程中将身份插入设置为开启?看起来您仅在更改存储过程时才将其设置为 on,而不是在实际调用它时。试试:

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

【讨论】:

【参考方案2】:

我相信它需要在单个查询批处理中完成。基本上,GO 语句将您的命令分成多个批次,这就是导致问题的原因。改成这样:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

【讨论】:

你说得对。这就是重点!下一个插入命令批处理应以 SET IDENTITY_INSERT tbl_content ON;再次命令。【参考方案3】:

您不应该将 identity_Insert 设置为 ON,插入记录然后再将其关闭吗?

像这样:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 
SET IDENTITY_INSERT tbl_content ON
...insert command...
SET IDENTITY_INSERT tbl_content OFF

【讨论】:

【参考方案4】:

提醒

SQL Server 只允许一个表将 IDENTITY_INSERT 属性设置为 ON。

这不起作用:

SET IDENTITY_INSERT TableA ON
SET IDENTITY_INSERT TableB ON
... INSERT ON TableA ...
... INSERT ON TableB ...
SET IDENTITY_INSERT TableA OFF
SET IDENTITY_INSERT TableB OFF

改为:

SET IDENTITY_INSERT TableA ON
... INSERT ON TableA ...
SET IDENTITY_INSERT TableA OFF
SET IDENTITY_INSERT TableB ON
... INSERT ON TableB ...
SET IDENTITY_INSERT TableB OFF

【讨论】:

【参考方案5】:

在查询上方添加这一行

SET IDENTITY_INSERT tbl_content ON

【讨论】:

【参考方案6】:

参考:http://technet.microsoft.com/en-us/library/aa259221%28v=sql.80%29.aspx

我的表名为Genre,包含IdNameSortOrder 3 列

我使用的代码如下:

SET IDENTITY_INSERT Genre ON

INSERT INTO Genre(Id, Name, SortOrder)VALUES (12,'Moody Blues', 20) 

【讨论】:

【参考方案7】:

加衬也

 SET IDENTITY_INSERT Genre ON

    INSERT INTO Genre(Id, Name, SortOrder)VALUES (12,'Moody Blues', 20) 

    SET IDENTITY_INSERT Genre  OFF

【讨论】:

【参考方案8】:

我有两个不同的表,第一个插入工作正常,但第二个会引发有关身份插入的异常。 问题是 表有一个字段(int)作为未填充的伪造密钥

【讨论】:

以上是关于IDENTITY_INSERT 设置为 OFF - 如何将其打开?的主要内容,如果未能解决你的问题,请参考以下文章

错误 IDENTITY_INSERT 设置为 OFF 但实际上它是 ON

无法插入显式值,因为 IDENTITY_INSERT 为 OFF,但无法将 IDENTITY_INSERT 设置为 ON,因为它已经为 ON

IDENTITY_INSERT 设置为 OFF - 如何将其打开?

[解决方案] 当 IDENTITY_INSERT 设置为 OFF 时

异常为"当IDENTITY_INSERT设置为OFF时" 解决办法

当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值