我想将记录从一个表复制到另一个表。在这样做时,我想设置我复制的那些记录的标志。
我就是这样做的(简化):
BEGIN TRANSACTION copyTran
insert into destination_table (name)
select top 100 name
from source_table WITH (TABLOCKX)
order by id
update source_table
set copy_flag = 1
where id in (select top 100 id from source_table order by id)
COMMIT TRANSACTION copyTran
有更简单的方法吗?
答案 0 :(得分:4)
通过利用OUTPUT
条款,您可以将其归结为单个UPDATE
语句
UPDATE source_table
SET copy_flag = 1
OUTPUT inserted.name
INTO destination_table(name)
WHERE id IN
(
SELECT TOP 100 id
FROM source_table
ORDER BY id
)
注意:现已通过测试。应该工作得很好。
答案 1 :(得分:1)
您的查询存在的问题是,如果有人在您运行查询时插入了一些数据,您可能会在UPDATE
中获得不同的记录。使用INSERTED
关键字是明智的。
Declare @temp TABLE (Id integer);
INSERT INTO destination_table (name)
OUTPUT INSERTED.Id into @temp
SELECT TOP 100 name
FROM source_table
ORDER BY id
UPDATE source_table
SET copy_flag = 1
WHERE Id IN (SELECT Id FROM @temp)
答案 2 :(得分:0)
我认为您可以使用一个临时表,在订购它们之后,您将在源表中存储前100个ID。这样就可以避免在每个id的where子句中执行select语句。
BEGIN TRANSACTION copyTran
insert into destination_table (name)
select top 100 name
from source_table
order by id
declare @Ids TABLE(id int)
@Ids = (select top 100 id from source_table order by id)
update source_table
set copy_flag = 1
where id in (SELECT * FROM @Ids)
COMMIT TRANSACTION copyTran