1

我需要将表 A 中的所有现有行移动到表 B。我还需要只选择表 A 中移动的行。(不是来自表 B,因为表 B 是一个存档并且包含很多行,这将导致选择花费大量时间)

我正在使用 Microsoft SQL Server 2008 和 .Net (System.Data.SqlClient)

请注意,记录是连续插入到表 A 中的。我需要确保只选择移动的记录,并且在删除之前从表 A 中选择它们。

最有效的方法是什么?

4

3 回答 3

3

你不能做这样的事情:

BEGIN TRANSACTION;

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

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

COMMIT TRANSACTION;

当然你不会使用 SELECT * 但我不知道你的表所以......

于 2012-06-14T11:56:12.253 回答
1

据我了解,您想做这样的事情:

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)

这将以某种安全的方式复制、选择和删除。

于 2012-06-14T11:53:58.050 回答
0

我终于能够通过使用 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

谢谢大家的帮助。

于 2012-06-14T12:44:09.237 回答