我有一个 SSIS 包,它调用 OLE DB 命令来更新/插入/删除数据流中的记录。
现在的问题是命令偶尔可能会出错,由于重复的键错误、缺少必需的列或其他什么,我想记录这些错误,因为 SSIS 错误很神秘,没有告诉我根本问题是什么。
所以我更新了正在调用的 SP,使其具有一个名为@ErrorMessage NVARCHAR(4000) OUTPUT
的OUTPUT
参数。 我将@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();