SQL Server:从运行中终止SQL

时间:2009-06-05 15:01:53

标签: sql sql-server tsql

即使使用“GO”,如果if语句为true,是否会导致脚本阻止运行?

例如,我想做类似以下的事情:

insert into table1 (col1, col2) value ('1', '2')
GO
if exists(select * from table1 where col1 = '1')
  BEGIN
    --Cause Script to fail
  END
GO
insert into table1 (col1, col2) value ('1', '2') --Wont run

这样做的实际目的是当我们丢弃要运行DBA的包时,防止表创建脚本/插入/删除/更新多次运行。

4 个答案:

答案 0 :(得分:4)

GO不是transact-sql关键字 - 它实际上是常见SQL Server工具所理解的批处理终结符。如果您在应用程序中使用它,您的应用程序将失败。

你为什么不这样做?

IF NOT EXISTS (select * from table1 where col1 = '1')
BEGIN
     --Do Some Stuff
END

如果符合条件 ,则不要中止脚本,只有在条件不符合时才运行脚本。

或者,您可以将代码包装在proc中并使用RETURN退出proc。

答案 1 :(得分:1)

根据文档,将严重性传递给RAISEERROR()的某些值可能导致不同级别的终止。

最感兴趣的(如果您通过SQL Management Studio或类似程序运行脚本,并希望阻止任何尝试在文件中运行任何后续命令)可能是:

  

从20到25的严重程度被认为是致命的。如果遇到致命严重性级别,则在收到消息后终止客户端连接,并在错误和应用程序日志中记录错误。

答案 2 :(得分:0)

您没有指定用于运行所述脚本的工具。 sqlcmd and osql tools have the -b parameter 'On error batch abort',它完全符合您的要求。只需用RAISERROR("failure", 16, 1)替换'cause script t fail'即可。

@Jason我强烈建议不要在脚本中使用高于16的错误级别。对于一个,18以上的级别需要sysadmin权限才能开始。其次,它们可以触发来自管理监控的所有类型的自动响应甚至内部由引擎,包括启动故障转移或使数据库脱机等严厉措施。最后但并非最不重要的是,如果有人正在调查一个真实的事件,他们会浪费很多时间:'在崩溃前一小时发生硬件故障,嗯,让我看看这个'。

答案 3 :(得分:-1)

使用转到。这听起来很难看,但对此非常有用。

编辑 - nm,这不起作用。当我以为我看到它工作时,它一定是个梦想