54

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

但我得到一个错误:

消息 8101,级别 16,状态 1,第 2 行
只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表“MyDB.dbo.Equipment”中的标识列指定显式值。

我的脚本:

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

4 回答 4

106

如消息所示,您可能只是缺少列列表

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 
于 2012-08-17T12:56:50.033 回答
18

错误消息的相关部分是

...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 
于 2012-08-17T12:57:56.720 回答
3

在 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。

为我工作。迟到但有效率!

于 2014-11-19T23:56:21.593 回答
1

这是 Microsoft 关于使用 SET IDENTITY_INSERT 的文章,如果其他人像我一样在尝试重新创建已删除的记录同时保持原始标识列值时发现这篇文章,这可能对他们看到这篇文章有所帮助。

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

于 2013-07-11T19:39:01.667 回答