我有一个临时表,具有混凝土表的确切结构T
.它是这样创建的:
select top 0 * into #tmp from T
在处理并填写内容后#tmp
,我想将内容复制回T
如下:
insert into T select * from #tmp
只要T
没有标识列,这是可以的,但在我的情况下确实如此.有什么办法可以忽略自我#tmp
复制时的自动增量标识列T
吗?我的动机是避免在Insert Into列表中拼出每个列名.
编辑:切换identity_insert不起作用,因为如果行插入到我的脚本外部,pkeys #tmp
可能会与那些pkey 发生冲突,即如果已自动增加pkey,则首先与T同步.T
T
#tmp
SET IDENTITY_INSERT ON
INSERT命令
SET IDENTITY_INSERT OFF
因为无论如何都会在插入过程中生成标识,您可以在将数据插回T之前从#tmp中删除此列吗?
alter table #tmp drop column id
UPD:这是我在SQL Server 2008中测试过的一个例子:
create table T(ID int identity(1,1) not null, Value nvarchar(50)) insert into T (Value) values (N'Hello T!') select top 0 * into #tmp from T alter table #tmp drop column ID insert into #tmp (Value) values (N'Hello #tmp') insert into T select * from #tmp drop table #tmp select * from T drop table T
在这里和这里查看答案:
select * into without_id from with_id union all select * from with_id where 1 = 0
原因:
当将现有的标识列选择到新表中时,除非满足以下条件之一,否则新列将继承IDENTITY属性:
SELECT语句包含一个join,GROUP BY子句或聚合函数。
使用UNION可以连接多个SELECT语句。
在选择列表中,身份列被列出了不止一次。
标识列是表达式的一部分。
标识列来自远程数据源。
如果这些条件中的任何一个为true,则将创建列NOT NULL而不是继承IDENTITY属性。如果新表中需要标识列,但该列不可用,或者您想要的种子或增量值与源标识列不同,请使用IDENTITY函数在选择列表中定义该列。请参阅下面的示例部分中的“使用IDENTITY函数创建身份列”。
所有功劳归功于Eric Humphrey和bernd_k