即使使用“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的包时,防止表创建脚本/插入/删除/更新多次运行。
答案 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,这不起作用。当我以为我看到它工作时,它一定是个梦想