2008-09-23 169 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