SSIS包 - 如何从2000年的记录集中获取第n条记录?

时间:2016-07-04 10:52:40

标签: sql-server ssis

我有一个带有Source作为SalesForce对象的SSIS包(通过Pragmatic Task Factory)。从SalesForce,我获得了2000条记录的记录集。我想从此记录集中获取特定的行号记录(第1,第401,第801,第1201和第1601)。

我有一种方法可以通过在临时表中添加所有记录并在临时表上激活选择查询来实现此目的。但是我不想用这种方式,因为它会减慢这个过程。我必须处理总共5-7百万条记录。

我是否有办法从SSIS包中获得2000年的记录集中的第n条记录? (通过脚本任务或任何其他方式?)

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

最终,我不知道为什么你总是只想要第400条记录,但我不知道商业案例.....如果你真的只是试图获取数据的样本,请使用{{1}转换并设置你想要的记录数。

如果您的源中没有间隙的顺序数字标识,则可以使用多重转换并执行聚合来确定,最大值,最小值和计数,然后使用带有条件拆分的聚合来切断源。但这并不是完全证明,而且差距肯定会破坏逻辑。

无论如何,我知道如何完全按照您的描述进行操作的最佳方法是通过ROW SAMPLING中的script component [SC]。解决方案的要点是:

  • 将脚本组件添加为转换
  • 将源连接到转换脚本组件
  • 在SC中添加新的输出列
  • 编辑脚本添加行号代码
  • 添加条件分割
  • 对数据做任何你想做的事。

我将专注于脚本组件。

添加组件并转到“输入和输出”部分以定义输出。在这个例子中,我将使用RowNumber和Flag。我将两者放在一起的原因是为了向您展示如何生成实际数字,以及如何标记记录以使条件拆分中的逻辑更容易。

enter image description here

现在返回“脚本”部分,然后选择页面底部的“编辑脚本”按钮。滚动浏览直至看到Data Flow [DF]。这是脚本的入口/起点。

对于RowNumber,定义一个私有变量来保存当前行号,我喜欢在public override void PreExecute()之上执行此操作。在PreExecute()方法中,将该变量的值设置为0.然后在PreExecute()函数处添加逻辑以确定行号是否为1,401等,并将Flag Output列值设置为true或者是假的。同时增加变量并将其分配给RowNumber输出列。

enter image description here

所以你要/修改的代码将是:

Input0_ProcessInputRow

现在只需添加条件分割即可。关于条件拆分的好消息是因为标志列永远不为空且它是private int _rowNumber; public override void PreExecute() { base.PreExecute(); _rowNumber = 0; } public override void Input0_ProcessInputRow(Input0Buffer Row) { /* setting flag before the increment so that it is a 0 based operation */ if (_rowNumber == 0 || (_rowNumber % 400) == 0) { Row.Flag = true; } else { Row.Flag = false; } /* increment and assign the row number */ _rowNumber++; Row.RowNumber = _rowNumber; } 你的条件实际上只是列名Boolean

enter image description here

所以最后你的数据流看起来像这样:

enter image description here

注意我测试了5000个测试记录并且它运行良好。希望它可以帮到你。

答案 1 :(得分:0)

您可以在源查询中添加row_number()。然后进行条件分割,询问row_number%2000 == 0

答案 2 :(得分:0)

根据您的具体情况,可能会采用以下方法之一。

第一种方法是首先仅选择所需的行。查询可能如下所示:

select sq.*
from (
    select t.*, row_number() over(order by <Put your sort order here>) as [RN]
    from dbo.Table t
    ) sq
where sq.RN % 400 = 1;

另一种方法可能是在SSIS中添加一个列并逐步编号 - 例如描述here。在它之后放置一个简单的条件分割就可以了。

答案 3 :(得分:0)

source {a} query如下:

with cte as (
select *, row_number() over(order by put_name_of_colum) as [RN]
    from your_table
    )
    select*from cte where RN in(1,401,801,1201,1601)