34

这似乎是一个非常愚蠢的问题,但我如何让 SQL Server Management Studio 在遇到错误时停止处理 SQL 脚本?

我有一个很长的脚本,如果一开始有错误,SSMS 会报告它,然后盲目地继续,把事情搞砸了。我不能使用事务,因为脚本创建了几个数据库并且它们不能进入事务。有时会失败是数据库创建。

Toad for SQL Server 将在遇到第一个错误时暂停,并询问您是要停止还是继续。这是我正在寻找的行为。它存在于 SSMS 中吗?

不是在问,“我如何编写或修改脚本以使其在出现错误时停止?” 我对修改我的脚本以实现这一点不感兴趣,我只想让 SSMS在出现错误时停止。Toad for SQL Server正是这样做的,这就是我想要的行为。这也不是659188的副本,因为这与修改脚本以停止 SSMS 有关。

4

9 回答 9

11

简短的回答:你不能。

感谢那些提供解决方法的人,但似乎 SSMS 本身无法像 Toad for SQL Server 那样设置为暂停或停止错误。

于 2009-05-11T02:38:22.967 回答
7

考虑使用 SQL Server 附带的命令行程序“sqlcmd”,并设置 -b 和 -V 选项。-b 将导致 sqlcmd 在遇到错误时退出。-V 控制被认为是错误的严重性级别。

于 2010-08-17T01:24:49.910 回答
6

ApexSQL 脚本以您想要的方式生成批处理脚本。举个例子:

--Script Header
begin transaction
go

{Statement #1}
go
--Standard Post-Statement Block
if @@error <> 0 or @@trancount = 0 begin
    if @@trancount > 0 rollback transaction
    set noexec on
end
go

{Statement #2}
go
--Standard Post-Statement Block
if @@error <> 0 or @@trancount = 0 begin
    if @@trancount > 0 rollback transaction
    set noexec on
end
go

--Script Footer
if @@trancount > 0 commit transaction
go
set noexec off
go
于 2009-05-11T00:08:40.233 回答
5

您需要将 SQL 语句包装在Transaction中。

BEGIN TRANSACTION
   /* run all your SQL statements */
COMMIT TRANSACTION

如果开始/结束事务中出现错误,所有语句都将回滚。

编辑:在开始/结束事务内部包装,将阻止语句提交到数据库,但不会在此时停止它。您需要另外将其包装在 try/catch 块中,如下所示:

BEGIN TRY
  BEGIN TRANSACTION
  /* run all your SQL statements */
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION
END CATCH
于 2009-05-11T00:03:59.850 回答
4

11年后SSMS仍然没有这个功能......

但!您可以启用SQLCMD mode(菜单/查询/SQLCMD 模式),然后在文本编辑器中定义此选项:

:ON ERROR EXIT

在你的 t-sql 脚本之前。现在它将停止执行错误。

于 2020-05-25T16:29:14.907 回答
3

哇。这有点垃圾不是吗?我使用 SQL-Workbench,就像 Toad for SQL Server 一样,可以轻松处理这个问题。但与 Toad for SQL Server 不同,它是免费的。

我很惊讶这样的基本功能不是标准工具的一部分。

于 2009-08-19T22:36:16.057 回答
2

将在此处使用 try catch 块帮助。出错时将退出try,在catch中实现错误处理

http://msdn.microsoft.com/en-us/library/ms179296.aspx

于 2009-05-11T00:06:40.000 回答
2

这里提到了更多的解决方法:

SQL Server - 停止或中断 SQL 脚本的执行

SQL Server:如何中止查询分析器中的一系列批处理?

(raiseerror 20 with log, set noexec on, sqlcmd mode :on error exit 等)

于 2011-04-05T23:26:30.213 回答
0

如果您不能将脚本放入存储过程并使用 return 语句在错误时退出,那么@Justice 提供的解决方案可能是您最好的选择。其他人都忽略了这一点——你不能从脚本中返回,即使你使用事务或者即使你 raiserror。SSMS 无论如何都会执行下一件事,即使 set xact abort 已打开。

如果您可以将脚本转换为存储过程,那么您可以在检测到错误时从它返回。

于 2009-05-11T02:06:29.090 回答