在SQL Server中安全地移动/归档行

时间:2018-07-18 12:03:48

标签: sql sqltransaction

我有这个SQL脚本/ sp

    BEGIN TRAN
    BEGIN TRY
      INSERT INTO TblDest
      SELECT * FROM TblSource
      DELETE FROM TblSource
      COMMIT TRAN
    END TRY
    BEGIN CATCH
       ROLLBACK TRAN
    END CATCH

它将TblSource中的所有行移动到TblDest。我想确保在完成备份时插入的任何行都保留在TblSource中。

如果我在DELETE行之前设置一个断点,然后打开另一个窗口并在TestSource中插入新的Row,然后完成脚本,则新行将被删除。

我需要临时表还是可以锁定整个表?

2 个答案:

答案 0 :(得分:2)

您可以使用HOLDLOCK提示:

INSERT INTO TblDest
      SELECT * FROM TblSource WITH (HOLDLOCK)
      DELETE FROM TblSource
  

HOLDLOCK 等效于SERIALIZABLE。 HOLDLOCK仅适用于表   或仅为其指定期间的视图   由使用它的语句定义的事务。HOLDLOCK   不能在包含FOR BROWSE的SELECT语句中使用   选项。

从MSDN:Table hints

答案 1 :(得分:1)

您可以尝试如下查询。

  BEGIN TRAN
        BEGIN TRY
          INSERT INTO TblDest SELECT * FROM TblSource
          DELETE FROM TblSource where [SomeId] in (select id from TblDest)
          COMMIT TRAN
        END TRY
        BEGIN CATCH
           ROLLBACK TRAN
        END CATCH