是否有一种方法可以立即停止SQL服务器中SQL脚本的执行,如“break”或“exit”命令?

我有一个脚本,它在开始插入之前执行一些验证和查找,我希望它在任何验证或查找失败时停止。


当前回答

您可以将SQL语句包装在WHILE循环中,并在需要时使用BREAK

WHILE 1 = 1
BEGIN
   -- Do work here
   -- If you need to stop execution then use a BREAK


    BREAK; --Make sure to have this break at the end to prevent infinite loop
END

其他回答

你可以使用RAISERROR。

非常感谢这里的其他人以及我读过的其他帖子。 但没有什么能满足我所有的需求,直到@jaraics回答。

我所见过的大多数答案都忽略了具有多个批处理的脚本。他们忽略了SSMS和SQLCMD的双重用法。我的脚本在SSMS中是完全可运行的——但我想要F5预防,这样他们就不会在意外中删除现有的对象集。

SET PARSEONLY ON工作得很好,可以防止不必要的F5。但是你不能用SQLCMD运行。

另一件让我慢下来的事情是Batch在出现错误时如何跳过任何进一步的命令-所以我的SET NOCOUNT ON被跳过,因此脚本仍然运行。

不管怎样,我稍微修改了一下jaraics的答案:(在这种情况下,我还需要一个数据库从命令行激活)

-----------------------------------------------------------------------
-- Prevent accidental F5
-- Options:
--     1) Highlight everything below here to run
--     2) Disable this safety guard
--     3) or use SQLCMD
-----------------------------------------------------------------------
set NOEXEC OFF                             -- Reset in case it got stuck ON
set CONTEXT_INFO  0x1                      -- A 'variable' that can pass batch boundaries
GO                                         -- important !
if $(SQLCMDDBNAME) is not null
    set CONTEXT_INFO 0x2                   -- If above line worked, we're in SQLCMD mode
GO                                         -- important !
if CONTEXT_INFO()<>0x2 
begin
    select 'F5 Pressed accidentally.'
    SET NOEXEC ON                          -- skip rest of script
END
GO                                         -- important !
-----------------------------------------------------------------------

< rest of script . . . . . >


GO
SET NOEXEC OFF
print 'DONE'

这是存储过程吗?如果是这样,我认为你可以只做一个返回,如“返回NULL”;

我在这里一直使用RETURN,在脚本或存储过程中工作

如果您在事务中,请确保您ROLLBACK事务,否则立即RETURN将导致一个开放的未提交事务

只需使用RETURN(它可以在存储过程内部和外部工作)。