有没有一种方法可以立即停止SQL server中SQL脚本的执行,比如"中断"或"退出"命令?

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

推荐答案

The 100 method

raiserror('Oh no a fatal error', 20, -1) with log

这将终止连接,从而停止脚本的其余部分运行.

请注意,严重级别20或更高以及WITH LOG选项都是以这种方式工作所必需的.

这甚至适用于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".

注意事项:

  • 这仅在您以管理员身份登录("系统管理员"角色)时有效,并且您没有数据库连接.
  • 如果您没有以管理员身份登录,RAISEERROR()调用本身将失败and the script will continue executing次.
  • 当使用sqlcmd调用时.exe,将报告退出代码2745.

参考:http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334

The noexec method

另一种适用于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.

Sql相关问答推荐

如何实现一个广泛的多级自连接PostgreSQL查询?

跨多列的PostgreSQL非不同对

LAG函数通过丢弃空值返回前一行

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

部分匹配表中元素的MariaDB查询查找结果

SQL:计算与另一列中给定值互斥的匹配项

如何在SQL中更新Json字符串

在SQL查询中使用COALESS

按日期时间(不包括秒)连接表

每年独特口味的冰淇淋数量

如何用客户名称计算sum(dr)和sum(cr)

数据库SQL-CTE命名空间(错误?)使用临时视图

仅在日期相隔时递增(Oracle SQL)

表函数的作用域和功能

根据标识符将两行合并为一行

当 ansible 变量未定义或为空时,跳过 sql.j2 模板中的 DELETE FROM 查询

使用给定的变量对在循环中执行更新语句

查询以查找今天和昨天的数据之间的差异以及伪列

超过100名员工的连续行

奇怪的甲骨文行为