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
,包含Id
、Name
和SortOrder
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 时