2012-01-23 75 views
5

我知道標題似乎有些奇怪,但是這就是我想做的事:T-SQL刪除插入的記錄

  1. 我有表有許多記錄。
  2. 我想獲得一些這樣的記錄並將它們插入到其他表中。事情是這樣的:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. 棘手的部分是,我想,我已經插入到該行被刪除形式源表爲好。

有沒有一種簡單的方法來做到這一點,因爲只有想我能夠做到的就是用一個臨時表保存選定的記錄,然後把他們在第二個表和刪除行是與第一張表中的他們匹配。這是一個解決方案,但有這麼多的紀錄(超過300萬,一半),我找一些其他的想法...

+0

版本? –

+1

使用OUTPUT子句... –

回答

13

在2005+使用OUTPUT條款是這樣的:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew 
WHERE YourCondition 

它會在一個事務中進行,已完成或回滾同時

+0

不知道我是否可以恢復這個,但是當源表和目標表中有一個標識列時,有沒有辦法做到這一點? – intA

0

你應該做一些事情是這樣的:

INSERT INTO "table1" ("column1", "column2", ...) 
SELECT "column3", "column4", ... 
FROM "table2" 
WHERE ... 

DELETE FROM "table1" 
WHERE ... 
+2

WHERE是DELETE嗎? –

2

可以使用insert ... output子句將複製行的ID存儲在臨時表中。然後,您可以根據臨時表從原始表中刪除行。的SQL Server

declare @Table1 table (id int, name varchar(50)) 
declare @Table2 table (id int, name varchar(50)) 

insert @Table1 (id,name) 
      select 1, 'Mitt' 
union all select 2, 'Newt' 
union all select 3, 'Rick' 
union all select 4, 'Ron' 


declare @copied table (id int) 

insert @Table2 
     (id, name) 
output inserted.id 
into @copied 
select id 
,  name 
from @Table1 
where name <> 'Mitt' 

delete @Table1 
where id in 
     (
     select id 
     from @copied 
     ) 

select * 
from @Table1 

Working example at Data Explorer.