我想将表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
答案 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