代码之家  ›  专栏  ›  技术社区  ›  TallGuy

如何让SQL Server Management Studio停止处理错误?

  •  27
  • TallGuy  · 技术社区  · 16 年前

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

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

    问“如何编写或修改脚本以使其在出现错误时停止?”我对修改脚本以实现这一点不感兴趣,我只希望SSMS 出错时停止 . SQL Server的Toad 659188 因为这与修改脚本以停止SSM有关。

    8 回复  |  直到 8 年前
        1
  •  12
  •   TallGuy    16 年前

    简单回答:你不能。

    多亏了那些提供了解决方法的人,但是SSM本身似乎不能像Toad for SQL Server那样设置为在出现错误时暂停或停止。

        2
  •  6
  •   yfeldblum    16 年前

    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
    
        3
  •  6
  •   Phil Dennis    14 年前

        4
  •  5
  •   Jose Basilio    16 年前

    您需要将SQL语句包装在 Transaction .

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

    如果begin/end事务中有错误,所有语句都将回滚。

    将语句包装在begin/end transaction内部将阻止语句提交到数据库,但不会在此时停止它。您还需要将其包装在try/catch块中,如下所示:

    BEGIN TRY
      BEGIN TRANSACTION
      /* run all your SQL statements */
      COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
      ROLLBACK TRANSACTION
    END CATCH
    
        5
  •  4
  •   Kerry Sainsbury Kerry Sainsbury    15 年前

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

        6
  •  3
  •   Ruslan K.    5 年前

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

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

    :ON ERROR EXIT
    

    在t-sql脚本之前。现在,它将在出现错误时停止执行。

        7
  •  2
  •   Stuart    16 年前

    在这里使用try-catch块会有帮助。出现错误时,将退出重试,在捕获中实现错误处理

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

        8
  •  2
  •   Community CDub    8 年前

    这里还提到了一些解决办法:

    SQL Server - stop or break execution of a SQL script

    SQL Server: How to abort a series of batches in Query Analyzer?

    (带日志的raiseerror 20,将noexec设置为on,sqlcmd模式:on error exit,等等)

        9
  •  0
  •   Eric Z Beard    16 年前

    如果您不能将脚本放入存储过程并使用return语句在出错时退出,那么@Justice提供的解决方案可能是最佳选择。其他所有人都忽略了这一点——即使使用事务或出现错误,也无法从脚本返回。不管怎样,SSMS将只执行下一个操作,即使set xact abort处于启用状态。