SSIS 2012 错误输出从 Ole DB 命令



我有一个 SSIS 包,它调用 OLE DB 命令来更新/插入/删除数据流中的记录。

现在的问题是命令偶尔可能会出错,由于重复的键错误、缺少必需的列或其他什么,我想记录这些错误,因为 SSIS 错误很神秘,没有告诉我根本问题是什么。

所以我更新了正在调用的 SP,使其具有一个名为@ErrorMessage NVARCHAR(4000) OUTPUTOUTPUT参数。 我将@ErrorMessage的值设置为在 SP 的 catch 块中ERROR_MESSAGE。我已经遵循了许多站点的说明(在 OLE DB 命令 - SSIS 中成为存储过程的输出参数)在数据流中使用输出参数,但我创建的新列(SaveError 定义为 Unicode 字符串长度 4000)。但是,当 SP 出错时,"保存错误"列的值永远不会从NULL更改。

如果基础 SQL 最终引发异常,输出参数是否不会被读入?有没有人对如何实现这一目标有任何好主意?

示例 SP 代码(这只是一个示例,我无法提供实际代码 Catch Block 是匹配的):

CREATE PROCEDURE dbo.UpdateRecord(
@NewValue1 INT,
@IdValue INT,
@ErrorMessage NVARCHAR(4000) OUTPUT
) 
AS
BEGIN
BEGIN TRY
MERGE TableA as Tgt
USING (
VALUES(@IdValue, @NewValue1)
) AS src(IdValue, MyName)
ON Tgt.Id = src.IdValue
WHEN NOT MATCHED THEN
INSERT (Id, MyName)
VALUES(Src.IdValue, Src.MyName)
WHEN MATCHED THEN
UPDATE 
SET MyName = Src.MyName;
END TRY
BEGIN CATCH
SET @ErrorMessage = ERROR_MESSAGE()
declare @ErrorSeverity int, @ErrorState int;
select @ErrorMessage = ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();
raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH
END

您的 SP 中没有OUTPUT参数(不再适用,OP 已更新其帖子)

但是,如果您的TRY...CATCH工作正常,那么是的,将返回OUTPUT参数的值。举个简单的例子:

CREATE PROC chartoint (@Char char(1), @Error nvarchar(4000) OUTPUT)
AS
BEGIN TRY
SELECT CONVERT(int, @Char) AS intValue;
END TRY
BEGIN CATCH
SET @Error = ERROR_MESSAGE()
DECLARE @ErrorSeverity int, @ErrorState int;
SELECT @Error = ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();
RAISERROR (@Error, @ErrorSeverity, @ErrorState);
END CATCH
GO
DECLARE @ErrorOut nvarchar(4000);
EXEC chartoint 'A', @ErrorOut OUTPUT;
PRINT @ErrorOut;
GO
DROP PROC chartoint;
GO

是否正确调用了 SP。猜测一下,您在调用 SP 时没有使用OUTPUT子句。

我在类似的项目中遇到了同样的问题。我找到了一个解决方法,但我不知道它是否强大。我读到OLE DB命令不应该从数据库接收任何数据。 在 CATCH 中尝试一下。添加第一行。我的包裹中出现了错误。

SELECT ERROR_MESSAGE() as Error__;
SET @Error = ERROR_MESSAGE();

最新更新