我正在经历一些奇怪的事情。我在 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 约束违规中,我得到:“数据值违反了完整性约束。”
关于为什么仅使用重复键插入会发生这种情况的任何建议或想法?提前致谢!