2010-06-24 88 views
68

我有一个删除的文件存档数据库,它存储了被删除的文件的ID,我希望管理员能够恢复该文件(以及链接文件的相同ID)。我不想将identity_insert从整个表中删除,因为增加一个很有效。在我插入到TBL_Content存储过程我有这样的事情IDENTITY_INSERT设置为OFF - 如何打开它?

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 

但我不断收到同样的错误:

Cannot insert explicit value for identity column in table 'TBL_Content' when IDENTITY_INSERT is set to OFF.

任何帮助吗?

回答

108

如果您改为对设置在存储过程中的标识插入?它看起来像只在更改存储过程时才设置它,而不是在实际调用它时。尝试:

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

SET IDENTITY_INSERT tbl_content ON 

...insert command... 

SET IDENTITY_INSERT tbl_content OFF 
GO 
9

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

SET IDENTITY_INSERT tbl_content ON 
/* GO */ 

...insert command... 

SET IDENTITY_INSERT tbl_content OFF 
GO 
+1

你的权利。这是重点!下一批插入命令应以SET IDENTITY_INSERT tbl_content ON开头;再次命令。 – Jettero 2017-03-08 20:17:04

15

您不应该将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 
3

在上方添加此行查询

SET IDENTITY_INSERT tbl_content ON 
9

提醒

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 
相关问题