如果我在SQL Server Management Studio中取消执行请求,那么在什么时候将停止一系列选定的SQL语句?

时间:2009-06-09 06:52:35

标签: sql-server ssms

我正在运行一堆数据库迁移脚本。我发现自己有一个相当紧迫的问题,即业务正在醒来,并期望看到他们的数据,他们的数据还没有完成迁移。我还将应用程序脱机,他们确实需要重新启动。实际上“业务”是许多公司,因此我在一个查询窗口中有许多运行SP的脚本,如下所示:

EXEC [dbo].[MigrateCompanyById] 34
GO
EXEC [dbo].[MigrateCompanyById] 75
GO
EXEC [dbo].[MigrateCompanyById] 12
GO
EXEC [dbo].[MigrateCompanyById] 66
GO

每个SP都会调用大量其他子SP来迁移所需的所有数据。我正在考虑取消查询,但我不确定执行将在什么时候取消。如果它在下一个GO取消很好,那么我会很高兴。如果它在公司迁移中途取消,那我就搞砸了。

如果我无法取消,我可以更改MigrateCompanyById SP并注释所有子SP呼叫吗?这会阻止下一个运行,同时完成当前正在运行的那个吗?

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

实现受控取消的一种方法是添加包含取消标记的表。您可以在取消优惠时设置此标志,并且您的SP可以定期检查并在适当时停止执行。

答案 1 :(得分:0)

无论如何我被迫取消了剧本。

这样做时,我注意到它在当前执行语句之后取消,无论它在SP执行链中的什么位置。

答案 2 :(得分:0)

您是否将每个迁移存储过程中的代码包含在事务处理(BEGIN,COMMIT等)中?这将使您能够相对轻松地回滚更改,具体取决于您在过程中执行的操作。

我见过一个解决方案,你有一个表,其中一个记录的位值为0或1,如果该记录为0,你的生产应用程序不允许用户访问,使你可以做任何你需要的事情在任务完成后将该标志设置为1,以使生产继续。根据您的环境,这可能不实用,但可以确保没有用户会通过您的应用程序搞乱您的数据,直到您认为它已经准备好被搞乱为止。

答案 3 :(得分:0)

您可以使用this method报告脚本的执行进度。 你现在拥有它的方式是每个sproc都是它自己的交易。因此,如果您取消脚本,您将只获得部分更新,直到最后一次成功执行的程序。

但是,如果您需要全部或不需要更新,那么您可以将其全部置于单一交易中。