2012-06-14 46 views
1

我需要將表A中的所有現有行移動到表B上。我還需要僅從表A中選擇移動的行。(不是從表B開始,因爲表B是一個存檔幷包含很多行,在選擇服用大量的時間)如何將行從表A移動到B並只選擇從A移動的行?

我使用Microsoft SQL Server 2008和.Net(System.Data.SqlClient的)

請注意,記錄不斷被插入到表答:我需要確保只有移動的記錄被選中,並且它們在被刪除之前從表A中選擇。

什麼是最有效的方法來做到這一點?

+1

如果您將記錄從表A移動到B,那麼記錄傳輸後您將如何從表A讀取相同的記錄。我認爲這是移動不復制操作。 –

+0

我顯然需要在移動之前選擇 – Harindaka

+0

您可以在源表中創建一個時間戳/自動編號字段,在此基礎上您可以確定要選擇移動的記錄。 –

回答

0

我終於能通過使用SQL Server的OUTPUT子句解決此問題。看看下面。國際海事組織我沒有看到爲什麼這種方法可以防止任何不必要的鎖。

declare @TempTable TABLE(Col1 bigint, Col2 varchar(50)) 

delete from TableA 
output Deleted.Col1, Deleted.Col2 INTO @TempTable 

insert into TableB (Col1, Col2) 
select Col1, Col2 from @TempTable 

select Col1, Col2 from @TempTable 

謝謝大家的幫助。

+0

這基本上和我的答案一樣,不是嗎?除了我先選擇並且不涉及額外的@table。 –

+0

是的,幾乎除了你的表鎖定表,而這不。 – Harindaka

+0

難道你不希望這是一個阻止操作? –

1

什麼,我知道你會喜歡做這樣的事情:

SELECT [] 
INTO archivetable 
FROM activetable 

SELECT [] 
FROM activetable 
WHERE id in (SELECT id from archivetable) 

DELETE 
FROM activetable 
WHERE id in (SELECT id from archivetable) 

這將複製,選擇並以某種安全的方式刪除。

+0

掃描歸檔表會很慢,因爲它可能有數十億條記錄。 –

+1

關於第二個查詢,我不想讓存檔表在選擇和刪除查詢中涉及它的巨大數量,並且會顯着降低查詢速度。不是嗎?任何其他方式? – Harindaka

+0

是的,但這意味着使用一些主鍵無論如何... –

3

你能不能做這樣的事情:

BEGIN TRANSACTION; 

SELECT * FROM source WITH (HOLDLOCK) 
WHERE ... 

DELETE source 
OUTPUT deleted.* INTO destination 
WHERE ...; 

COMMIT TRANSACTION; 

當然你不會用SELECT *,但我不知道你的表,這樣...

+0

我認爲,沒有人能夠在事務完成之前更新源表的記錄。這意味着沒有新的記錄插入。 –

+0

@Romil這是一個必要條件,因爲OP想要爲離散的一組行做到這一點。否則,源表可能會改變中間事務。 – JNK

+0

要在沒有事務的情況下運行此操作,可以將已刪除的查詢輸出到表變量,然後選擇並將其插入到歸檔中。 –

相關問題