复制记录时更新

时间:2013-12-05 09:14:53

标签: sql sql-server sql-server-2008

我想将记录从一个表复制到另一个表。在这样做时,我想设置我复制的那些记录的标志。

我就是这样做的(简化):

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

有更简单的方法吗?

3 个答案:

答案 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