Ole DB Command

时间:2018-01-22 15:02:25

标签: sql-server ssis etl ssis-2012

我有一个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

2 个答案:

答案 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();