首页 > 解决方案 > SSIS OLE DB 目标 - 错误输出重定向错误,没有说明

问题描述

我正在经历一些奇怪的事情。我在 SSIS 包中有一个数据流任务,它带有一个从表中获取数据的 OLE DB 源 - 然后有一个查找转换检查目标表中是否已经存在行键(目标表中的主键)然后查找否匹配输出连接到 OLE DB 目标。我还在脚本组件上连接了 OLE DB 目标的错误输出,该组件获取错误消息和错误列,以防出现问题并将这些数据插入异常表中。

我面临的问题是我的源表中有重复的行键,所以在这种情况下,错误会从 OLE DB 目标重定向到我的异常表,但我在异常表中得到的错误描述是“没有可用的状态” 而不是“违反 PRIMARY KEY 约束..无法在对象中插入重复键..重复键值是..” 这是包的屏幕截图,在此处输入图像描述这是脚本代码:

public bool fireAgain = true;
public string customErrorDescription;
public string customErrorDescription;
public string ErrorDescription;
public string ErrorColumnDescription;
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
try
{
    var component130 = ComponentMetaData as IDTSComponentMetaData130;

    if (component130 != null)
    {
        Row.DateTimeInserted = DateTime.Now;

        if (Row.ErrorColumn <= 0)
        {
            ErrorColumnDescription = "No Data available - Unknown Error";
        }
        else if (Row.ErrorColumn > 0)
        {

            ErrorColumnDescription = component130.GetIdentificationStringByID(Row.ErrorColumn);
        }
        ErrorDescription = component130.GetErrorDescription(Row.ErrorCode).Replace("\r\n", " ");

        //Writes the error as Information in Logging
        customErrorDescription =
         $"Error in OLE DB Destination:{ErrorDescription}" +
         $"In Column: {ErrorColumnDescription}";
        ComponentMetaData.FireInformation(10, "Error", "Error", ErrorDescription, 0, fireAgain);

        Row.ErrorDescription = ErrorDescription;
        Row.ErrorColumnDescription = ErrorColumnDescription;
        Row.DestinationTableName = Variables.DestinationTable;
        Row.SourceName = "Source_View";
        Row.SourceType = "View";
    }
}
catch (Exception Ex)
{
    ComponentMetaData.FireError(10, "Error", Ex.Message, Ex.Message, 0, out fireAgain);
}

}

我想提一下,在不允许 null 的列中截断或 null 插入等其他错误中,这似乎工作正常。

例如在截断中,我得到:“转换失败,因为数据值溢出了提供程序使用的类型。” 在 NULL 约束违规中,我得到:“数据值违反了完整性约束。”

关于为什么仅使用重复键插入会发生这种情况的任何建议或想法?提前致谢!

标签: sql-serverssisetlsql-server-2016oledbdestination

解决方案


您应该注意,OLE DB 目标执行两种类型的验证:(1) 客户端和 (2) 服务器端。您可以查看以下答案以获取更多详细信息:

SSIS 引擎不会在运行时捕获服务器端错误(外键、触发器...)的描述,而客户端验证错误的描述(截断、非空...)是可读的。


推荐阅读