我有这个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,然后完成脚本,则新行将被删除。
我需要临时表还是可以锁定整个表?
答案 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