当故意导致故障时,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'无效。
捕获永远不会被执行。
答案 0 :(得分:5)
SP永远不会执行 - 它只是不编译 - 因此无需执行
以这样的方式重写您的TRY部分并再次尝试:
BEGIN TRY
EXEC('SELECT ErrorTest FROM ErrorTest')
END TRY