我有一个带有转换脚本组件的SSIS包。它加载约460行,然后停止再次执行脚本组件(我不知道为什么这样做),它会再次创建我的C#类变量,并“忘记”它是“第一次运行”时弹出的null变量。

无论如何,是否会使脚本组件在460行后不再运行其自身?我要拉的批次是10000,所以不能那样做。

最奇怪的是,在运行程序包3次(不做任何更改)之后,它可以正确执行所有操作...

public class ScriptMain : UserComponent
{
    string MarkToRem;
    string TypeToRem;
    string SerToRem;
    int IDCnt;

    public override void PreExecute()
    {

        base.PreExecute();

    }
    public override void PostExecute()
    {
        base.PostExecute();


    }


    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

        MyOutputBuffer.AddRow();
          if(Row.IncomingPrice == "Mark")
          {
            MarkToRem = Row.IncomingCode ; // Setting ver to remember the mark we are in
            MyOutputBuffer.ID = Row.IncomingID.ToString();
            MyOutputBuffer.Mark = MarkToRem;
            MyOutputBuffer.Type = "";
            MyOutputBuffer.Series = "";
            MyOutputBuffer.Code = "";
            MyOutputBuffer.Price = "";
            MyOutputBuffer.Description = "Mark Verander";


          }
          else if( Row.IncomingPrice == "Sub")
          {
             TypeToRem = Row.IncomingCode; // Save our current Type
             SerToRem = Row.IncomingCode; //Save our current Series
             // ============ Output ========================
             MyOutputBuffer.ID = Row.IncomingID.ToString();
             MyOutputBuffer.Mark = MarkToRem;
             MyOutputBuffer.Type = "";
             MyOutputBuffer.Series = "";
             MyOutputBuffer.Code = "";
             MyOutputBuffer.Price = "";
             MyOutputBuffer.Description = "Sub en series verander";

          }
          else if (Row.IncomingPrice == "Series")
          {

              SerToRem = Row.IncomingCode; //Save our current Series
              // ============ Output ========================
              MyOutputBuffer.ID = Row.IncomingID.ToString();
              MyOutputBuffer.Mark = MarkToRem;
              MyOutputBuffer.Type = "";
              MyOutputBuffer.Series = SerToRem;
              MyOutputBuffer.Code = "";
              MyOutputBuffer.Price = "";
              MyOutputBuffer.Description = "Series verander";

          }

          else
          {
              MyOutputBuffer.ID = Row.IncomingID.ToString();
              MyOutputBuffer.Mark = MarkToRem;
              MyOutputBuffer.Type = TypeToRem;
              MyOutputBuffer.Series =SerToRem;
              MyOutputBuffer.Code = Row.IncomingCode;
              MyOutputBuffer.Price = Row.IncomingPrice;
              MyOutputBuffer.Description = Row.IncomingDiscription;
          }
          IDCnt = IDCnt + 1;

    }


}


前9行如下所示。对于传入的数据

ID  Code    Price   Discription
1   184pin DDR  Mark
2   DDR - Non-ECC   Sub
3   ME-A1GDV4   388 Adata AD1U400A1G3-R 1Gb ddr-400 ( pc3200 ) , CL3 - 184pin - lifetime warranty
4   ME-C512DV4  199 Corsair Valueselect  VS512MB400 512mb ddr-400 ( pc3200 ) , CL2.5 - 184pin -             lifetime warranty
5   ME-C1GDV4   399 Corsair Valueselect  VS1GB400C3 1Gb ddr-400 ( pc3200 ) , CL3 - 184pin - lifetime warranty
6   240pin DDR2 Mark
7   DDR2 - Non-ECC  Sub
8   Adata - lifetime warranty   Series
9   ME-A2VD26C5 345 Adata AD2U667B2G5 Valuselect , 2Gb ddr2-667 ( pc2-5400 ) , CL5 , 1.8v -     240pin -    lifetime warranty

最佳答案

解决了。

尽可能避免异步转换

SSIS运行时按定义的顺序执行除数据流任务以外的所有任务。只要SSIS运行时引擎遇到数据流任务,就会将数据流任务的执行移交给数据流管道引擎。

数据流管道引擎将数据流任务的执行分解为一个或多个执行树,并且可以并行执行两个或多个执行树以实现高性能。

同步转换获取记录,对其进行处理,然后将其传递到序列中的其他转换或目标。记录的处理不依赖于其他传入的行。

而异步转换需要为其输出添加附加缓冲区,并且不利用传入的输入缓冲区。它还会等待所有传入的行到达进行处理,这就是异步转换执行速度较慢的原因,因此必须尽可能避免。例如,您可以使用ORDER BY子句从源本身获取排序的结果,而不是使用排序转换。

10-05 22:01