当故意导致故障时,Catch在SQL中失败

时间:2012-01-25 20:49:04

标签: sql sql-server sql-server-2005 tsql

当故意导致故障时,Catch在存储过程中失败。

我正在尝试通过在创建存储过程后更改列名来测试存储过程中的catch部分。但是捕获永远不会被执行,并且它在错误的行处失败。关于我可能做错的任何想法?

重现的步骤:

* Create Table ErrorTest 

    CREATE TABLE [dbo].[ErrorTest](

        [ErrorTest] [varchar](50) NULL

    ) ON [PRIMARY]

* Create Stored Procedure TestError

    SET NOCOUNT ON;

    DECLARE @EmailMessage AS VARCHAR(5000)

    BEGIN

        BEGIN TRY

            SELECT  ErrorTest FROM ErrorTest

        END TRY

        BEGIN CATCH             
            declare @error int, @message varchar(4000), @xstate int;
            select @error = ERROR_NUMBER()
                 , @message = ERROR_MESSAGE()
                 , @xstate = XACT_STATE();

        SET @EmailMessage = 'Failure ' + CHAR(13) + 'Error Code: '+ CAST(@error AS VARCHAR)  + CHAR(13) + @message
            EXEC    [leads].[usp_SendEmail]
                    @Mysubject = N'FAILURE!',
                    @Mybody = @EmailMessage,
                    @Myrecipients = N'me@email.com'                                     
        END CATCH
        END
  • 更改步骤1中列的名称 [ErrorTest]到[ErrorTest2]

  • 这将使存储过程失败并显示错误

    消息207,级别16,状态1,过程TestError,第8行 列名称'ErrorTest'无效。

  • 捕获永远不会被执行。

1 个答案:

答案 0 :(得分:5)

SP永远不会执行 - 它只是不编译 - 因此无需执行

以这样的方式重写您的TRY部分并再次尝试:

BEGIN TRY

    EXEC('SELECT  ErrorTest FROM ErrorTest')

END TRY