我有一个SSIS包调用OLE DB命令来更新/插入/删除数据流中的记录。
现在问题偶尔是命令可能错误,由于重复的Key错误,缺少必需的列或其他什么,我想记录这些错误,因为SSIS错误是神秘的并且不告诉我底层问题是什么是
因此,我更新了被调用的SP,其中包含名为OUTPUT
的{{1}}参数。我在SP的catch块中将@ErrorMessage NVARCHAR(4000) OUTPUT
的值设置为@ErrorMessage
。我已经按照许多站点(在Output Parameter of Stored Procedure In OLE DB Command - SSIS上)的说明使用数据流中的输出参数,但是我创建了新列(SaveError定义为Unicode字符串长度4000)。但是,当SP错误时,SaveError列的值永远不会从 ERROR_MESSAGE
更改。
如果底层SQL最终抛出异常,是否未读入输出参数?有没有人对如何做到这一点有任何好的想法?
示例SP代码(这只是我可以提供实际代码的示例Catch Block是匹配的):
NULL
答案 0 :(得分:0)
您的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
条款。
答案 1 :(得分:0)
我在类似的项目中遇到了同样的问题。我发现了一种解决方法,但我不知道它是否强大。我读到OLE DB命令不应该从数据库接收任何数据。 在CATCH中尝试这个。添加第一行。我能够在包装中出错。
SELECT ERROR_MESSAGE() as Error__;
SET @Error = ERROR_MESSAGE();