【问题标题】:Cannot catch SQL Server alter table error无法捕获 SQL Server 更改表错误
【发布时间】:2015-12-03 03:28:45
【问题描述】:

这是一个非常简单的代码,但它无法捕获错误。

或者如何捕捉错误?

谢谢。

BEGIN TRY
    ALTER TABLE [dbo].[my_table_name] 
    ADD PRIMARY KEY ([id]);
END TRY
BEGIN CATCH
    PRINT 'Primary Key already exists. '
END CATCH

【问题讨论】:

  • 您可能会发现这很有用:sqlusa.com/articles2008/trycatch
  • 也许你可以验证是否已经存在...如果不退出(SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY' ....blah
  • 如果不存在(SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'my_table_name')ALTER TABLE [dbo].[my_table_name] ADD PRIMARY KEY ([id]);
  • 谢谢,它也有效。
  • 很好“大多数语言都有现有的控制结构,旨在解决您的问题而不使用异常”不要陷入反模式

标签: sql sql-server sql-server-2012


【解决方案1】:

由于在延迟名称解析后批量重新编译而发生的错误不能在发生错误的同一级别上被捕获。一种解决方法是将 DDL 包装在动态 SQL 中:

BEGIN TRY
    EXEC(N'ALTER TABLE [dbo].[my_table_name] ADD PRIMARY KEY ([id]);');
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() = 1779
    BEGIN
        --handle expected errors
        PRINT 'Primary Key already exists. ';
    END
    ELSE
    BEGIN
        --raise other unexpected errors
        THROW;
    END;
END CATCH;

【讨论】:

    【解决方案2】:

    第一个答案绝对好,但是当您使用 DDL 时还有另一种方法可以捕获错误,即在 TRY 块内使用存储过程。 基于 MSdocumentation

    如果您不想保留存储过程,可以在尝试结束时轻松删除它。

    DROP PROCEDURE IF EXISTS dbo.sp_my_proc
    GO
    CREATE PROCEDURE dbo.sp_my_proc
    AS
        --Your original code here:
        ALTER TABLE [dbo].[my_table_name] 
        ADD PRIMARY KEY ([id]);
    GO
    
    BEGIN TRY  
        EXECUTE dbo.sp_my_proc 
        --Optional, if you don't want to keep sp
        DROP PROCEDURE IF EXISTS dbo.sp_my_proc  
    END TRY  
    BEGIN CATCH  
        --Catch your error here
        SELECT   
            ERROR_NUMBER() AS ErrorNumber  
            ,ERROR_MESSAGE() AS ErrorMessage;  
    END CATCH;
    

    所以有两种方法可以处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2017-05-13
      • 2016-12-20
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      相关资源
      最近更新 更多