如何调试作为SSIS项目一部分的脚本?

时间:2012-12-31 04:41:44

标签: c# sql-server visual-studio ssis data-warehouse

我有两个数据库。来源数据库: http://sdrv.ms/VkX8tj

和星际数据库: http://sdrv.ms/12S7Zkc

我正在使用SSIS项目将数据从第1个传输到第2个: sdrv.ms/YDUvU4

(不能发布第3个链接,抱歉给您带来不便)

正如您所看到的,我的脚本中存在错误。它是“该列具有空值”。或者确切地说(通过弹出窗口):

  

at Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer.CheckStatusAndNull(Int32 columnIndex)      在Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer.GetDecimal(Int32 columnIndex)      在ScriptMain.Input0_ProcessInputRow(Input0Buffer Row)      在UserComponent.Input0_ProcessInput(Input0Buffer Buffer)      在Microsoft.SqlServer.Dts.Pipeline.ScriptComponent.ProcessInput(Int32 InputID,PipelineBuffer buffer)      在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID,PipelineBuffer buffer)

和(通过调试器的输出):

  

错误:0xC0047062在数据流任务,脚本组件[337]:Microsoft.SqlServer.Dts.Pipeline.ColumnIsNullException:该列具有空值。      在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(例外e)      在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID,PipelineBuffer buffer)      在Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProcessInput(IDTSManagedComponentWrapper100包装器,Int32 inputID,IDTSBuffer100 pDTSBuffer,IntPtr bufferWirePacket)   错误:数据流任务中的0xC0047022,SSIS.Pipeline:SSIS错误代码DTS_E_PROCESSINPUTFAILED。组件“脚本组件”(337)上的ProcessInput方法在处理输入“输入0”(347)时失败,错误代码为0x80131600。标识的组件从ProcessInput方法返回错误。该错误特定于组件,但错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

除了填写这个函数之外,我的脚本完全是模板化的:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    decimal WorkerWage = Row.Amount * Row.HourWage * Row.ProductionHours;
    Row.WorkerWage = WorkerWage;

    decimal TotalProductionCost = Row.Amount * Row.ProductionHours * (Row.ProductionCost + Row.HourCost) + WorkerWage;
    Row.TotalProductionCost = TotalProductionCost;

    decimal StandardPrice = TotalProductionCost * (1 + Row.Profit/100);
    Row.StandardPrice = StandardPrice;

    decimal TotalDiscount = StandardPrice * (Row.Discount / 100);
    Row.TotalDiscount = TotalDiscount;

    decimal TotalPrice = StandardPrice - TotalDiscount;
    Row.TotalPrice = TotalPrice;

    decimal TotalShippingCost = Row.ShippingCost + TotalPrice * (Row.ShippingTax / 100);
    Row.TotalShippingCost = TotalShippingCost;

    decimal RealProfit = TotalPrice - TotalProductionCost;
    Row.RealProfit = RealProfit;

    decimal TraderMargin = RealProfit * (Row.ProfitMargin / 100);
    Row.TraderMargin = TraderMargin;
}

“列具有空值”意味着什么,但它是输入列还是输出一个,哪一个确切?怎么弄明白呢?

顺便说一下,请不要注意这个项目的基于内容的价值,因为它已经完成(好了,我希望这样做)仅用于教育目的。

1 个答案:

答案 0 :(得分:3)

查看您的架构,没有列似乎允许NULL。因此,源列中的值为NULL是不可能的。

您可以将失败的行重定向到其他目的地并查看它以识别有问题的行。

拉​​吉