2008-09-23 186 views
11

我有一个混凝土表T.它被这样产生的确切结构的临时表: 在T插入...选择*,如何忽略身份?

选择顶部0 *成#tmp

处理之后和在内容转换成#tmp填充,我想将内容复制回T如下: 插入到T select * from #tmp

只要T没有标识列,但在我的情况下它就是这样。有没有反正我可以忽略#tmp中的自动增量标识列,当我复制到T?我的动机是避免必须在“插入到”列表中拼出每个列名称。

编辑:切换identity_insert不会工作,因为#tmp中的pkeys可能会与T中的pk碰撞,如果行被插入到我的脚本之外的T中,那就是如果#tmp自动递增了pkey以与T中的同步第一个地方。

+0

你能解释一下多一点,为什么你要在第一时间请一个临时表的副本?可能有更好的方法来完成你正在寻找的东西。 – 2008-09-23 18:09:21

+0

1.它使我有机会在插入之前预览数据。 2.作为我的计算的一部分,我在两张临时表之间加入;临时表格允许我专注于我正在使用的确切设置数据。 我认为就是这样。任何建议/意见? – Haoest 2008-09-23 18:14:53

+0

你的目的只是为了将已经存在的数据加倍?或者在插入之前清除T? – 2010-03-19 18:55:31

回答

8

身份会无论如何都会在插入过程中生成,你能否简单地从#tmp中删除这一列,然后再将数据插回T?

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 
13

SET IDENTITY_INSERT ON

INSERT命令

SET IDENTITY_INSERT OFF

+0

如果我这样做,可能会有主键冲突,因为在#tmp准备好进行复制的时候,可能已经将相同的键插入到T. – Haoest 2008-09-23 18:04:06

+0

然后将其封装为事务工作吗? – Kolten 2008-09-23 18:06:06

+0

啊,那可行。我没有开始交易,直到#tmp准备好复制(我有很多tmps计算)以最大限度地缩短锁定时间。我想现在是合理的。 – Haoest 2008-09-23 18:10:11

0
set identity_insert on 

使用此。

1

不与SELECT * - 如果您选择的每一列,但身份,它会没事的。我能看到的唯一方法是,您可以通过动态构建INSERT声明来实现。

1

只需列出您想要重新插入的柱子,不应该使用select *。如果你不想键入这些,只是从对象浏览器拖放它们(如果展开表并拖动这个词,列,你会得到所有的人,只要删除ID列)

0

强权 “更新,其中T.ID =#tmp.ID” 的工作?

-1
  1. 它给了我一个机会,我做插入
  2. 我有临时表之间的连接是我计算的一部分前预览数据;临时表格允许我专注于我正在使用的确切设置数据。我认为就是这样。任何建议/意见?

对于部分1,如在评论中提及了由Kolten,封装您的语句在一个事务中,并加入一个参数来显示之间切换,并承诺将满足您的需求。对于第2部分,我需要看看你正在尝试什么“计算”。将数据限制在临时表中可能会使情况复杂化。

0

INSERT INTO #Table SELECT MAX(编号)+ ROW_NUMBER()OVER(ORDER BY Id)的

2

条回答herehere

select * into without_id from with_id 
union all 
select * from with_id where 1 = 0 

原因:

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

  • SELECT语句包含连接,GROUP BY子句或聚合函数。
  • 多个SELECT语句通过使用UNION进行连接。
  • 标识列在选择列表中列出多次。
  • 标识列是表达式的一部分。
  • 标识列来自远程数据源。

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

一切归功于Eric Humphreybernd_k