Как переместить строки из таблицы 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)
это будет копировать, выбирать и удалять в некоторой степени безопасным способом.