【问题标题】:How to generate sequence number for members of each group如何为每个组的成员生成序列号
【发布时间】:2017-07-06 15:15:05
【问题描述】:

我有一张类似这样的表:

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 重新开始。

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

【问题讨论】:

    标签: ssis ssis-2012


    【解决方案1】:

    是的,我已经按照你的描述做了;对数据流中的数据进行排序,并使用脚本分配序列号,每次更改某个列的值时重新开始。

    不,我手边没有任何示例代码。那是很久以前的事了。

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

    【讨论】:

      【解决方案2】:

      正如我所怀疑的,这可以通过添加排序转换然后调整脚本转换来实现。我在 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;
          }
      }
      

      我已经去掉了帮助和 cmets 以使代码更加简洁和可读。

      【讨论】:

        【解决方案3】:
        SELECT
            ROW_NUMBER() OVER(PARTITION BY ReportName ORDER BY ReportName) As Sequence,
            ReportName,
            GroupName,
        FROM ReportGroups
        

        【讨论】:

        • 谢谢。我以为我已经提出了我想避免更改 SQL 的问题,但我想不是。 +1 虽然答案可以满足问题(尽管我会在这里更改 ORDER BY)。
        最近更新 更多