Sql server SSIS包和引发错误
很抱歉,这是重复。我找不到一个答案与我所问的相符的问题。(这是相似的) 我有一个非常简单的SQL Server代理工作,只需一步。该包只执行一个存储过程。存储过程有一个try/catch块,当我试图引起异常时,它会被捕获,但不会向上传播并导致作业报告错误。工作成功了。我将错误记录到本地表中并提交它,这样我就知道我确实在输入catch块。我曾尝试提出严重级别为16和20的错误,以及其他一些可能不值得一提的事情 这是一个会导致它无法传播的包设置,还是我的存储过程有问题?谢谢Sql server SSIS包和引发错误,sql-server,stored-procedures,ssis,Sql Server,Stored Procedures,Ssis,很抱歉,这是重复。我找不到一个答案与我所问的相符的问题。(这是相似的) 我有一个非常简单的SQL Server代理工作,只需一步。该包只执行一个存储过程。存储过程有一个try/catch块,当我试图引起异常时,它会被捕获,但不会向上传播并导致作业报告错误。工作成功了。我将错误记录到本地表中并提交它,这样我就知道我确实在输入catch块。我曾尝试提出严重级别为16和20的错误,以及其他一些可能不值得一提的事情 这是一个会导致它无法传播的包设置,还是我的存储过程有问题?谢谢 -- dumbed do
-- dumbed down structure
BEGIN
SET NOCOUNT ON;
-- buncha vars
BEGIN TRY
BEGIN TRANSACTION
set @StepNumber = 10;
select 1/0;
COMMIT TRANSACTION;
RETURN 0;
END TRY
BEGIN CATCH
-- get the error
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- rollback the transaction
ROLLBACK TRANSACTION;
-- log the caught exception into the local log
set @LogTimestamp = GETUTCDATE();
set @LogMessage = @SessionGUID + ' - ' + CAST(@StepNumber AS NVARCHAR) + ' - ' + ' ERROR - ENTERED CATCH BLOCK - ERROR_MESSAGE()=' + @ErrorMessage + ' ERROR_SEVERITY()=' + cast(@ErrorSeverity as nvarchar) + ' ERROR_STATE()=' + CAST(@ErrorState as nvarchar) ;
insert into @LocalLog(TimestampDT, SourceVch, MessageVch) values (@LogTimestamp, @LogSource, @LogMessage);
-- transfer local log to master log table
BEGIN TRANSACTION;
--insert into RealTable selecting from @LocalLog;
COMMIT TRANSACTION;
-- slightly modify the error message before raising it to parent process
SET @ErrorMessage = @LogSource + ' - error with @StepNumber=[' +CAST(@StepNumber as nvarchar)+ '] ERROR_MESSAGE()=' + @ErrorMessage;
-- rethrow the error to the calling process
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
-- do we need this return?
RETURN @StepNumber;
END CATCH
END
我得到的日志表告诉我至少(从我的日志表)捕获了错误。
“6a3e80fd-f480-459c-a42f-25fd3d5a42a8-125-错误-输入的捕获块-错误消息()=除以零遇到错误。错误严重性()=16错误状态()=1”SSIS是否注意到错误并采取其异常路径?在调试器中运行包也不会失败(我是在别人的肩膀上做这件事的,所以我还不能完全调查它)。从存储的proc.PackageStart->包执行开始。-->OnProgress->Executing query->PackageEnd->PackageEnd生成相同的日志消息。我怀疑这与ExecuteSQL任务(或其连接管理器)的方式有关已在SSIS包中设置,但对我来说时间很长…我很感激您的持续响应。我尝试通过存储过程处理程序中的RAISERROR来传播错误。我注释了RAISERROR语句并返回@StepNumber。然后,我在包中添加了另一个工作流片段,并编写了脚本if=success else failure并将其分支到包内的成功电子邮件或失败电子邮件中。在SQL Server代理->作业中,当我启动并单步执行并运行它时。它会在步骤上产生错误(我首先需要此错误)。我还不确定我做错了什么,但这是可行的。再次感谢。显然ADO.Net驱动程序与RAISEERROR的配合比OLE DB驱动程序更好,但我还没有机会测试