当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《插入选择*,如何忽略身份?》经验,为你挑选了3个好方法。

我有一个临时表,具有混凝土表的确切结构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同步.TT#tmp



1> Orion Adrian..:

SET IDENTITY_INSERT ON

INSERT命令

SET IDENTITY_INSERT OFF



2> DK...:

因为无论如何都会在插入过程中生成标识,您可以在将数据插回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



3> sǝɯɐſ..:

在这里和这里查看答案:

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

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有