我试着做这个查询
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是一个行和宽都很大的表,也就是说它有很多列。我不想手动输入所有的列。我怎样才能让它工作呢?
我使用以下命令创建一个与表完全相同但没有标识的临时表:
SELECT TOP 0 CONVERT(INT,0)myid,* INTO #temp FROM originaltable
ALTER TABLE #temp DROP COLUMN id
EXEC tempdb.sys.sp_rename N'#temp.myid', N'id', N'COLUMN'
得到关于重命名的警告,但没什么大不了的。
我在生产类系统中使用这种方法。有助于确保复制将跟随将来的任何表修改,并且所产生的临时文件能够在任务中获得额外的行。请注意,PK约束也被删除了-如果你需要它,你可以在最后添加它。
SET IDENTITY_INSERT tableA ON
你必须为INSERT语句创建一个列列表:
INSERT Into tableA ([id], [c2], [c3], [c4], [c5] )
SELECT [id], [c2], [c3], [c4], [c5] FROM tableB
不像“INSERT Into tableA SELECT ........”
SET IDENTITY_INSERT tableA OFF
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
为了将所有列名填充到这个问题的解决方案的Select语句的逗号分隔列表中,我使用了以下选项,因为它们比这里的大多数响应更简洁。然而,这里的大多数回答仍然是完全可以接受的。
1)
SELECT column_name + ','
FROM information_schema.columns
WHERE table_name = 'YourTable'
2)这可能是创建列最简单的方法,
如果你有SQL Server SSMS。
1)在对象资源管理器中打开表,单击表名左侧的“+”或双击表名打开子列表。
2)将列子文件夹拖到主查询区,它将为您自动生成整个列列表。
总结
SQL Server不允许您在标识列中插入显式值,除非您使用列列表。因此,你有以下选项:
制作一个列列表(手动或使用工具,见下文)
OR
将tbl_A_archive中的标识列设置为常规的非标识列:如果您的表是一个归档表,并且总是为标识列显式指定一个值,那么为什么还需要标识列呢?只需要使用常规int型就可以了。
方案一详细说明
而不是
SET IDENTITY_INSERT archive_table ON;
INSERT INTO archive_table
SELECT *
FROM source_table;
SET IDENTITY_INSERT archive_table OFF;
你需要写
SET IDENTITY_INSERT archive_table ON;
INSERT INTO archive_table (field1, field2, ...)
SELECT field1, field2, ...
FROM source_table;
SET IDENTITY_INSERT archive_table OFF;
用field1, field2,…包含表中所有列的名称。如果您想自动生成列列表,请查看Dave的答案或Andomar的答案。
方案二详细说明
不幸的是,仅仅将单位int列的“类型”更改为非单位int列是不可能的。基本上,你有以下几种选择:
如果存档表还不包含数据,则删除该列并添加一个不带标识的新列。
OR
使用SQL Server Management Studio将存档表中的标识列的标识规范/(是标识)属性设置为No。在幕后,这将创建一个脚本来重新创建表并复制现有数据,因此,要做到这一点,您还需要取消设置Tools/Options/Designers/ table和Database Designers/Prevent保存需要重新创建表的更改。
OR
使用此回答中描述的解决方法之一:从表中的列中删除标识