【问题标题】:How do I get SQL Server Management Studio to stop processing on an error?如何让 SQL Server Management Studio 停止处理错误?
【发布时间】:2009-05-11 00:01:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 它在盲目地做你告诉它做的事情!您是否告诉它在出现错误时停止?如果从 ADO.NET 或其他脚本执行工具运行,相同的脚本会因错误而停止吗?问题是你的脚本,而不是 SSMS。
  • 大多数现代高级执行环境在出错时会立即停止。除非明确告诉不要停止或告诉在错误时分支到错误处理语句。
  • 假设这是真的(如果我在乎的话,我会要求你支持它),这与关于 SQL Server 的问题有什么关系。一批 T-SQL 语句的语义不包括在没有被告知的情况下停止错误。这些语义不会因为“大多数现代高级执行环境在出错时立即停止”而改变。
  • 这些 cmets 都不是乐于助人的人。他只是在问会产生这种行为的设置在哪里。

标签: sql-server ssms


【解决方案1】:

简短回答:你不能。

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

【讨论】:

  • 我认为这不是真的。这不是应该处理这个问题的工具,而是脚本。您需要使用 TRY CATCH 块或 IF @@ERROR 语句
  • 不要使用go语句,一个接一个地输入语句
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

      【解决方案4】:

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

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

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

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

      BEGIN TRY
        BEGIN TRANSACTION
        /* run all your SQL statements */
        COMMIT TRANSACTION
      END TRY
      BEGIN CATCH
        ROLLBACK TRANSACTION
      END CATCH
      

      【讨论】:

      • 我不能。该脚本创建了多个数据库,但它们无法进入事务,有时是数据库创建失败。
      • 这样的话,TRY/CATCH块就足够了
      • 如果是try/catch,则不能使用GO
      • 交易过程中的任何错误都会取消它,但不会回滚,所以你会收到更多的错误消息,afaik
      • 可能不是这个问题的正确答案,但这是我正在寻找的答案 ;-)
      【解决方案5】:

      11 年后 SSMS 还没有这个功能……

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

      :ON ERROR EXIT
      

      在您的 t-sql 脚本之前。现在它会在出错时停止执行。

      【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • Toad 还有一个免费版本,每个组织最多有 N (5?) 个用户。
      【解决方案7】:

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

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

      【讨论】:

        【解决方案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 with log, set noexec on, sqlcmd mode :on error exit 等)

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-17
            相关资源
            最近更新 更多