无法捕获SQL Server alter table错误

时间:2015-12-03 03:28:46

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

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

或者如何捕获错误?

感谢。

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

2 个答案:

答案 0 :(得分:5)

在延迟名称解析后因批量重新编译而发生的错误无法在错误发生的同一级别捕获。一种解决方法是将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;

答案 1 :(得分:0)

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

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

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;

所以有两种方法可以解决这个问题。