我需要将表 A 中的所有现有行移动到表 B。我还需要只选择表 A 中移动的行。(不是来自表 B,因为表 B 是一个存档并且包含很多行,这将导致选择花费大量时间)
我正在使用 Microsoft SQL Server 2008 和 .Net (System.Data.SqlClient)
请注意,记录是连续插入到表 A 中的。我需要确保只选择移动的记录,并且在删除之前从表 A 中选择它们。
最有效的方法是什么?
我需要将表 A 中的所有现有行移动到表 B。我还需要只选择表 A 中移动的行。(不是来自表 B,因为表 B 是一个存档并且包含很多行,这将导致选择花费大量时间)
我正在使用 Microsoft SQL Server 2008 和 .Net (System.Data.SqlClient)
请注意,记录是连续插入到表 A 中的。我需要确保只选择移动的记录,并且在删除之前从表 A 中选择它们。
最有效的方法是什么?
你不能做这样的事情:
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)
这将以某种安全的方式复制、选择和删除。
我终于能够通过使用 SQL Server 的 OUTPUT 子句来解决这个问题。看看下面。IMO 我看不出为什么这种方法会持有任何不必要的锁。
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
谢谢大家的帮助。