2012-01-23 30 views
5

Ben başlık garip gelebilir biliyorum ama bu yapmak istediğim şudur:T-SQL Sil Eklenen Kayıtlar

  1. Masayı olan birçok kayıtları ile.
  2. Bu kayıtlardan bazılarını almak ve diğer tablolara eklemek istiyorum. Böyle bir şey:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. zor kısmı ben ekledikten bu satırları yanı formu kökenli tablo silinecek istememizdir.

Sadece benden başarmış olduğunu düşünüyorum çünkü bunu yapmak için kolay bir yolu var mı satırları ikinci tabloda koydu ve silmek için seçilen kayıtları tasarrufu için geçici tablo kullanmak ve olduğunu İlk tablodan onlarla maç. Bu bir çözümdür, ama bu kadar çok kayıtlarıyla (3 milyondan fazla ve yarısı) Ben başka fikri arıyorum ...

+0

Sürüm? –

+1

OUTPUT deyimini kullanın ... –

cevap

13

böyle OUTPUT fıkra:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew 
WHERE YourCondition 

tek işlemde gerçekleştirilen ve tamamlamış veya

+0

Bunu yeniden diriltebilir miyim bilmiyorum, ancak kaynak ve hedef tablolarda bir kimlik sütunu olduğunda bunu yapmanın bir yolu var mı? – intA

0

Böyle bir şeyi yapmalıdır: 2005+ Kullanımda

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

DELETE FROM "table1" 
WHERE ... 
+2

DELETE nedir? –

2

Senkullanabilirsiniz aynı anda geri almak olacak Kopyalanan satırların kimliklerini geçici bir tabloda saklamak içincümlesi. Sonra satırları orijinal tablodan geçici tabloya göre silebilirsiniz. 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.