插入...选择*,如何忽略身份?

Hao*_*est 13 sql sql-server

我有一个临时表,具有混凝土表的确切结构T.它是这样创建的:

select top 0 * into #tmp from T
Run Code Online (Sandbox Code Playgroud)

在处理并填写内容后#tmp,我想将内容复制回T如下:

insert into T select * from #tmp
Run Code Online (Sandbox Code Playgroud)

只要T没有标识列,这是可以的,但在我的情况下确实如此.有什么办法可以忽略自我#tmp复制时的自动增量标识列T吗?我的动机是避免在Insert Into列表中拼出每个列名.

编辑:切换identity_insert不起作用,因为如果行插入到我的脚本外部,pkeys #tmp可能会与那些pkey 发生冲突,即如果已自动增加pkey,则首先与T同步.TT#tmp

Ori*_*ian 13

SET IDENTITY_INSERT ON

INSERT命令

SET IDENTITY_INSERT OFF


DK.*_*DK. 9

因为无论如何都会在插入过程中生成标识,您可以在将数据插回T之前从#tmp中删除此列吗?

alter table #tmp drop column id
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


sǝɯ*_*ɯɐſ 5

在这里这里查看答案:

select * into without_id from with_id
union all
select * from with_id where 1 = 0
Run Code Online (Sandbox Code Playgroud)

原因:

当将现有的标识列选择到新表中时,除非满足以下条件之一,否则新列将继承IDENTITY属性:

  • SELECT语句包含一个join,GROUP BY子句或聚合函数。
  • 使用UNION可以连接多个SELECT语句。
  • 在选择列表中,身份列被列出了不止一次。
  • 标识列是表达式的一部分。
  • 标识列来自远程数据源。

如果这些条件中的任何一个为true,则将创建列NOT NULL而不是继承IDENTITY属性。如果新表中需要标识列,但该列不可用,或者您想要的种子或增量值与源标识列不同,请使用IDENTITY函数在选择列表中定义该列。请参阅下面的示例部分中的“使用IDENTITY函数创建身份列”。

所有功劳归功于Eric Humphreybernd_k