如何为每个组的成员生成序列号

时间:2017-07-06 15:15:06

标签: ssis ssis-2012

我有一张类似于此的表格:

CREATE TABLE dbo.ReportGroups (
    ReportName     VARCHAR(50)    NOT NULL,
    GroupName      VARCHAR(50)    NOT NULL,
    SequenceNumber SMALLINT       NOT NULL,
    CONSTRAINT PK_ReportGroups PRIMARY KEY CLUSTERED (ReportName, GroupName)
)

我从一个仅包含报告名称和组名的平面文件导入到此表中,因此我需要生成SequenceNumber。对于每个报告,序列号应重新开始为1。

我已经看到如何使用正常序列号的脚本任务执行此操作,但是对于每个新报告名称重新启动似乎并不存在。我的猜测是我需要使用Sort转换,然后添加代码来检查报告名称的变化(?)有没有人做过这样的事情?要分享的任何示例代码?

3 个答案:

答案 0 :(得分:1)

是的,我就像你描述的那样做了这件事;对数据流中的数据进行排序,并使用脚本分配序列号,每次更改某列的值时重新启动。

并且我没有任何示例代码方便。很久以前。

如果我今天这样做,并且能够使用临时表,我会按原样将数据导入到临时表中,然后调用使用ROW_NUMBER()的存储过程来分配序列号。目的地表。

答案 1 :(得分:1)

我怀疑,通过添加排序转换然后调整脚本转换,可以实现这一点。我添加了Sort on ReportName-> GroupName,然后将以下代码添加到脚本转换中:

public class ScriptMain : UserComponent
{
    short seqNum;
    string reportName;

    public override void PreExecute()
    {
        base.PreExecute();

        seqNum = 0;
        reportName = "";
    }

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

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (Row.MapName != reportName)
        {
            reportName = Row.MapName;
            seqNum = 1;
        }
        else
            seqNum++;

        Row.SequenceNumber = seqNum;
    }
}

我已经删除了帮助和评论,以使代码更加简洁和可读。

答案 2 :(得分:1)

SELECT
    ROW_NUMBER() OVER(PARTITION BY ReportName ORDER BY ReportName) As Sequence,
    ReportName,
    GroupName,
FROM ReportGroups