2017-07-06 60 views
1

我有一个表,它是与此类似:如何生成每个组的成员序列号

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

我已经看到了如何与正常的序列号中的脚本任务做到这一点,但在重新启动对每个新的报告名称似乎并没有到这里来了。我的猜测是我需要使用排序转换,然后添加代码来检查报告名称中的更改(?)有没有人做过这样的事情?任何示例代码共享?

回答

1

正如我怀疑,这是可以通过添加排序转换,然后调整脚本转换。我加在ReportName-排序>组名,然后下面的代码添加到脚本转换:

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; 
    } 
} 

我已经剥离出来的帮助和意见,使码多一点凝聚和可读性就在这里。

1

是的,我已经这样做了,就像你描述;对数据流中的数据进行排序并使用脚本来分配序列号,每当某个列的值发生更改时重新开始。

而且没有,我没有任何的示例代码得心应手。很久以前了。

如果我今天这样做了,并且能够使用登台表,我会将数据原样导入登台表中,然后调用一个存储过程,使用ROW_NUMBER()将序号分配给目的地表。

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

感谢。我认为我已经提出了我想避免对SQL进行更改的问题,但我想不是。 +1虽然对于满足这个问题的答案(尽管我会在这里更改ORDER BY)。 –