1

テーブルAの既存のすべての行をテーブルBに移動する必要があります。また、テーブルAから移動した行のみを選択する必要があります(テーブルBはアーカイブであり、多くの行が含まれているため、テーブルBからではありません。時間をかけて選択してください)

Microsoft SQL Server 2008と.Net(System.Data.SqlClient)を使用しています

レコードはテーブルAに継続的に挿入されることに注意してください。削除する前に、移動したレコードのみが選択され、テーブルAから選択されていることを確認する必要があります。

これを行うための最も効率的な方法は何ですか?

4

3 に答える 3

3

Can't you do something like this:

BEGIN TRANSACTION;

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

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

COMMIT TRANSACTION;

Of course you wouldn't use SELECT * but I don't know your tables so...

于 2012-06-14T11:56:12.253 に答える
1

To what I understand you would like to do something like this:

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)

this will copy, select and delete in a somewhat safe way.

于 2012-06-14T11:53:58.050 に答える
0

I was finally able to solve this issue by using the SQL Server's OUTPUT clause. Have a look below. IMO I see no reason why this method would hold any unnecessary locks either.

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

Thanks you all for your help.

于 2012-06-14T12:44:09.237 に答える