有没有办法立即停止在 SQL 服务器中执行 SQL 脚本,例如“break”或“exit”命令?
我有一个脚本,它在开始执行插入之前进行一些验证和查找,如果任何验证或查找失败,我希望它停止。
该RAISERROR方法
raiserror('Oh no a fatal error', 20, -1) with log
这将终止连接,从而停止运行脚本的其余部分。
请注意,WITH LOG
要以这种方式工作,严重性级别 20 或更高以及该选项都是必需的。
这甚至适用于 GO 语句,例如。
print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'
会给你输出:
hi
Msg 2745, Level 16, State 2, Line 1
Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 1
Oh no a fatal error
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
请注意,未打印 'ho'。
警告:
参考:http : //www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334
noexec 方法
另一种适用于 GO 语句的方法是set noexec on
. 这会导致跳过脚本的其余部分。它不会终止连接,但你需要noexec
在执行任何命令之前再次关闭。
例子:
print 'hi'
go
print 'Fatal error, script will not continue!'
set noexec on
print 'ho'
go
-- last line of the script
set noexec off -- Turn execution back on; only needed in SSMS, so as to be able
-- to run this script again in the same session.
棒极了!这是一种“大棒”方法,但有时您确实需要它。请注意,它需要严重性 20(或更高)和“WITH LOG”。
请注意,使用 noexec 方法,脚本的其余部分仍会被解释,因此您仍然会遇到编译时错误,例如列不存在。如果您想通过跳过某些代码来有条件地处理涉及缺失列的已知架构更改,我知道的唯一方法是在 sqlcommand 模式下使用 :r 来引用外部文件。
noexec 的东西很棒。非常感谢!
我正在尝试这种方法,但当我意识到时没有得到正确的结果...... raiserror 中只有一个 E ......
如果要在以非 sysadmin 用户身份运行的脚本中使用它,请确保将严重性设置为 18 或更低。脚本将继续执行。