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

时间:2020-03-06 14:36:53  来源:igfitidea点击:

我有一个临时表,具有具体表T的确切结构。它是这样创建的:

select top 0 * into #tmp from T

处理完内容并将其填充到#tmp中后,我想像下面那样将内容复制回T中:

insert into T select * from #tmp

只要T没有Identity列就可以,但是在我的情况下是这样。复制到T时,有什么方法可以忽略#tmp中的自动递增身份列?我的动机是避免拼写"插入到"列表中的每个列名。

编辑:切换identity_insert将不起作用,因为如果将行插入到脚本之外的T中,则#tmp中的pkey可能会与T中的pkey冲突,也就是说,如果#tmp已将pkey自动递增到首先与T同步。

解决方案

将IDENTITY_INSERT设置为ON

INSERT命令

SET IDENTITY_INSERT OFF

set identity_insert on

用这个。

如果我们选择了每列而不是标识,则不使用" SELECT *",这样就可以了。我看到的唯一方法是可以通过动态构建INSERT语句来做到这一点。

只需列出要重新插入的列,则无论如何都不要使用select *。如果我们不想输入它们,只需将它们从对象浏览器中拖动(如果我们展开表格并拖动单词,列,我们将得到所有它们,只需删除id列即可)

由于无论如何都会在插入期间生成身份,我们能否在将数据插入回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

可以进行"更新T.ID =#tmp.ID的地方"吗?

it gives me a chance to preview the data before I do the insert 
  I have joins between temp tables as part of my calculation; temp tables allows me to focus on the exact set data that I am working with. I think that was it. Any suggestions/comments?

对于第1部分,正如Kolten在评论之一中提到的那样,将语句封装在事务中并添加参数以在显示和提交之间切换将满足需求。对于第2部分,我需要查看我们要尝试的"计算"。将数据限制为临时表可能会使情况复杂化。

插入#表
SELECT MAX(Id)+ ROW_NUMBER()OVER(按ID排序)