2012-01-23 7 views
5

Wiem, że tytuł może wydawać się dziwne, ale to jest to, co chcę zrobić:T-SQL Usuń włożonej płyty

  1. Mam tabeli z wielu rekordów.
  2. Chcę uzyskać niektóre z tych rekordów i wstawić je do innej tabeli. Coś takiego:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. Najtrudniejsze jest to, że chcę to wiersze, które mam wstawione do usunięcia formularz tabeli pochodzenia, jak również.

Czy istnieje łatwy sposób to zrobić, ponieważ tylko myślę, że udało mi się zrobić to użyć tabeli tymczasowej do zapisywania wybranych rekordów, a następnie umieścić je w drugiej tabeli i usuwać wiersze dopasuj się do nich z pierwszego stołu. Jest to rozwiązanie, ale z tak wielu rekordów (ponad 3 miliony i pół) szukam jakiś inny pomysł ...

+0

wersja SQL Server? –

+1

użyj klauzuli OUTPUT ... –

Odpowiedz

13

W 2005+ użytku OUTPUT klauzula tak:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew 
WHERE YourCondition 

to będzie wykonywane w pojedynczej transakcji i albo zakończone lub cofnąć jednocześnie

+0

Nie wiem, czy mogę wskrzesić to, ale czy istnieje sposób, aby to zrobić, gdy masz kolumnę tożsamości w tabelach źródłowych i docelowych? – intA

0

Powinieneś zrobić coś takiego:

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

DELETE FROM "table1" 
WHERE ... 
+2

WHere jest DELETE? –

2

można użyć insert ... output klauzula do przechowywania identyfikatorów skopiowanych wierszy w tabeli tymczasowej. Następnie możesz usunąć wiersze z oryginalnej tabeli na podstawie tabeli tymczasowej.

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.