设置IDENTITY_INSERT ON无效

时间:2012-08-17 12:55:35

标签: sql-server sql-server-2008 tsql

我想将表Equipment从一个数据库MyDBQA复制到我们的测试数据库MyDB。表中有一个标识列,它是主键(int,not null)。

但我收到了一个错误:

  

Msg 8101,Level 16,State 1,Line 2
  只有在使用列列表时才能指定表'MyDB.dbo.Equipment'中标识列的显式值   和IDENTITY_INSERT已开启。

我的剧本:

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON
INSERT INTO [MyDB].[dbo].[Equipment]  SELECT * FROM [MyDBQA].[dbo].[Equipment]
SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF

4 个答案:

答案 0 :(得分:88)

您可能只是错过了列列表,如消息所示

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON

INSERT INTO [MyDB].[dbo].[Equipment]
            (COL1,
             COL2)
SELECT COL1,
       COL2
FROM   [MyDBQA].[dbo].[Equipment]

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF 

答案 1 :(得分:14)

错误消息的相关部分是

...when a column list is used...

您没有使用列列表,而是使用SELECT *。改为使用列列表:

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON 

INSERT INTO [MyDB].[dbo].[Equipment] (Col1, Col2, ...)
SELECT Col1, Col2, ... FROM [MyDBQA].[dbo].[Equipment] 

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF 

答案 2 :(得分:2)

在VB代码中,当尝试提交INSERT查询时,您必须在同一个'executenonquery'中提交双重查询,如下所示:

sqlQuery = "SET IDENTITY_INSERT dbo.TheTable ON; INSERT INTO dbo.TheTable (Col1, COl2) VALUES (Val1, Val2); SET IDENTITY_INSERT dbo.TheTable OFF;"

我使用了;分隔符而不是GO。

适合我。迟到但效率高!

答案 3 :(得分:1)

以下是微软关于使用SET IDENTITY_INSERT的文章,如果他们像我一样在尝试重新创建已删除的记录时发现此帖子,同时保留原始标识列值,则可能对其他人有所帮助。

使用原始标识列值重新创建已删除的记录: http://msdn.microsoft.com/en-us/library/aa259221(v=sql.80).aspx