我试着做这个查询
INSERT INTO dbo.tbl_A_archive
SELECT *
FROM SERVER0031.DB.dbo.tbl_A
但即使在我跑了之后
set identity_insert dbo.tbl_A_archive on
我得到这个错误消息
表'dbo中标识列的显式值。tbl_A_archive'只能在使用列列表且IDENTITY_INSERT为ON时指定。
tbl_A是一个行和宽都很大的表,也就是说它有很多列。我不想手动输入所有的列。我怎样才能让它工作呢?
有一个或多个列具有自动递增属性,或者该属性的值将作为约束计算。你要修改这一列。
有两种解决方法
1)显式地提到其他列并只设置它们的值,PrimaryKey或自动递增列值将自动设置。
2)您可以打开IDENTITY_INSERT,然后执行插入查询,最后关闭IDENTITY_INSERT。
建议:按照第一步进行,因为这是更合适和有效的方法。
要了解更多信息,请阅读关于SQL-helper的文章。
SET IDENTITY_INSERT tableA ON
INSERT Into tableA ([id], [c2], [c3], [c4], [c5] )
SELECT [id], [c2], [c3], [c4], [c5] FROM tableB
不是这样的
INSERT INTO tableA
SELECT * FROM tableB
SET IDENTITY_INSERT tableA OFF
如果“归档”表是您的主表的精确副本,那么我只是建议您删除id是标识列的事实。这样你就可以插入它们了。
或者,您可以使用以下语句允许和禁止对表进行标识插入
SET IDENTITY_INSERT tbl_A_archive ON
--Your inserts here
SET IDENTITY_INSERT tbl_A_archive OFF
最后,如果您需要标识列按原样工作,那么您总是可以运行存储的过程。
sp_columns tbl_A_archive
这将返回表中的所有列,然后您可以将其剪切并粘贴到您的查询中。(这几乎总是比使用*更好)
如果存在Identity列,则必须指定要插入的列名。
所以命令如下所示:
SET IDENTITY_INSERT DuplicateTable ON
INSERT Into DuplicateTable ([IdentityColumn], [Column2], [Column3], [Column4] )
SELECT [IdentityColumn], [Column2], [Column3], [Column4] FROM MainTable
SET IDENTITY_INSERT DuplicateTable OFF
如果您的表有很多列,则使用此命令获取这些列的名称。
SELECT column_name + ','
FROM information_schema.columns
WHERE table_name = 'TableName'
for xml path('')
(删除最后一个逗号(','))只需复制过去的列名。
两者都可以工作,但如果使用#1仍然会出错,那么就使用#2
1)
SET IDENTITY_INSERT customers ON
GO
insert into dbo.tbl_A_archive(id, ...)
SELECT Id, ...
FROM SERVER0031.DB.dbo.tbl_A
2)
SET IDENTITY_INSERT customers ON
GO
insert into dbo.tbl_A_archive(id, ...)
VALUES(@Id,....)