我需要將表A中的所有現有行移動到表B上。我還需要僅從表A中選擇移動的行。(不是從表B開始,因爲表B是一個存檔幷包含很多行,在選擇服用大量的時間)如何將行從表A移動到B並只選擇從A移動的行?
我使用Microsoft SQL Server 2008和.Net(System.Data.SqlClient的)
請注意,記錄不斷被插入到表答:我需要確保只有移動的記錄被選中,並且它們在被刪除之前從表A中選擇。
什麼是最有效的方法來做到這一點?
我需要將表A中的所有現有行移動到表B上。我還需要僅從表A中選擇移動的行。(不是從表B開始,因爲表B是一個存檔幷包含很多行,在選擇服用大量的時間)如何將行從表A移動到B並只選擇從A移動的行?
我使用Microsoft SQL Server 2008和.Net(System.Data.SqlClient的)
請注意,記錄不斷被插入到表答:我需要確保只有移動的記錄被選中,並且它們在被刪除之前從表A中選擇。
什麼是最有效的方法來做到這一點?
我終於能通過使用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
謝謝大家的幫助。
什麼,我知道你會喜歡做這樣的事情:
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)
這將複製,選擇並以某種安全的方式刪除。
掃描歸檔表會很慢,因爲它可能有數十億條記錄。 –
關於第二個查詢,我不想讓存檔表在選擇和刪除查詢中涉及它的巨大數量,並且會顯着降低查詢速度。不是嗎?任何其他方式? – Harindaka
是的,但這意味着使用一些主鍵無論如何... –
你能不能做這樣的事情:
BEGIN TRANSACTION;
SELECT * FROM source WITH (HOLDLOCK)
WHERE ...
DELETE source
OUTPUT deleted.* INTO destination
WHERE ...;
COMMIT TRANSACTION;
當然你不會用SELECT *,但我不知道你的表,這樣...
我認爲,沒有人能夠在事務完成之前更新源表的記錄。這意味着沒有新的記錄插入。 –
@Romil這是一個必要條件,因爲OP想要爲離散的一組行做到這一點。否則,源表可能會改變中間事務。 – JNK
要在沒有事務的情況下運行此操作,可以將已刪除的查詢輸出到表變量,然後選擇並將其插入到歸檔中。 –
如果您將記錄從表A移動到B,那麼記錄傳輸後您將如何從表A讀取相同的記錄。我認爲這是移動不復制操作。 –
我顯然需要在移動之前選擇 – Harindaka
您可以在源表中創建一個時間戳/自動編號字段,在此基礎上您可以確定要選擇移動的記錄。 –