一尘不染

将长字符串分配给 int 停止 SSMS 处理并防止灾难性的“裸”F5 狂奔

sql

今天在 SSMS 中,我放错了指针并单击了“执行”按钮而不是“数据库”下拉菜单(它们在屏幕上相邻)。幸运的是,没有造成任何损害,但让我感到害怕的是,我可能已经在当前查询窗口中执行了所有操作,因为没有突出显示任何内容。我想在任何新查询窗口的顶部放置一个简单的命令,这将停止 F5 类型的执行。这似乎有效:

UPDATE atable SET intfield = 'freakout prevention' WHERE tablekey = 123
UPDATE atable SET intfield = 55 WHERE tablekey = 123

其中 intfield 是定义为 int 的列。运行两条线导致

将 varchar 值 ‘freakout Prevention’ 转换为数据类型 int 时转换失败。

此外,intfield 的值未设置为 55。

这是一个相当可靠的方法吗(我在这里不需要 100.00% - 足以捕捉我不小心执行“裸” F5 的罕见时间)“前缀”查询窗口以防止在没有突出显示时疯狂执行的方法并给出了执行命令?


阅读 114

收藏
2022-07-22

共1个答案

一尘不染

如果您没有批次(例如,GO),那么您可以将 RETURN 作为第一行。

如果您需要阻止所有批处理运行,您可以在脚本开头放置一个延迟。或者你可以添加一些消息....

我编辑了这个答案以添加一些额外的代码来检查未结交易。这与最初的问题无关,但我发现这对一些开发人员来说是一个更大的问题。

RAISERROR('You ran me by accident.  I will be wait for an hour for you to kill me.', 10, 1) WITH NOWAIT
WHILE (1=1) BEGIN
    WAITFOR DELAY '1:00:00'
    RAISERROR('I''m still waiting.  Please kill me.  Here goes another hour...', 10, 1) WITH NOWAIT
END
GO
RAISERROR('OMG!  Get the backups ready for a restore in production!  Also, update the resume.', 16, 1) WITH NOWAIT
GO
BEGIN TRAN
GO
-- [Updated] Extra check - open transaction
WHILE ( @@TRANCOUNT > 0 ) BEGIN
    RAISERROR('Execution is almost complete; however, a transaction is open.  Please COMMIT or ROLLBACK after you kill me.  Waiting 1 minute...', 10, 1) WITH NOWAIT
    WAITFOR DELAY '0:01:00'
END
RAISERROR('Execution is complete.', 10, 1) WITH NOWAIT
2022-07-22