Как переместить строки из таблицы A в B и выбрать только перемещенные строки из A?

Мне нужно переместить все существующие строки в таблице A в таблицу B. Мне также нужно выбрать ТОЛЬКО перемещенные строки из таблицы A. (Не из таблицы B, поскольку таблица B является архивом и содержит много строк, что приведет к выберите, заняв много времени)

Я использую Microsoft SQL Server 2008 и.Net (System.Data.SqlClient)

Обратите внимание, что записи постоянно вставляются в таблицу А. Мне нужно убедиться, что выбраны только перемещенные записи и что они выбраны из таблицы А перед их удалением.

Какой самый эффективный способ сделать это?

3 ответа

Решение

Я наконец смог решить эту проблему с помощью предложения OUTPUT в SQL Server. Посмотрите ниже. ИМО Я не вижу причин, по которым этот метод также будет удерживать ненужные блокировки.

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

Спасибо вам всем за вашу помощь.

Разве вы не можете сделать что-то вроде этого:

BEGIN TRANSACTION;

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

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

COMMIT TRANSACTION;

Конечно, вы бы не использовали SELECT *, но я не знаю ваших таблиц, так что...

Насколько я понимаю, вы хотели бы сделать что-то вроде этого:

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)

это будет копировать, выбирать и удалять в некоторой степени безопасным способом.

Другие вопросы по тегам