Ssis 如何为每个组的成员生成序列号
我有一张类似的表格:Ssis 如何为每个组的成员生成序列号,ssis,ssis-2012,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
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处重新开始
我已经了解了如何使用脚本任务为正常序列号执行此操作,但似乎没有为每个新报告名重新启动。我的猜测是,我需要使用排序转换,然后添加代码来检查报告名称中的更改(?)有人做过类似的事情吗?有没有要共享的示例代码?是的,我已经按照您的描述完成了这项工作;对数据流中的数据进行排序,并使用脚本分配序列号,每次某个列的值更改时重新开始 不,我手头没有任何示例代码。那是很久以前的事了
如果我今天这样做,并且能够使用暂存表,我会按原样将数据导入暂存表,然后调用一个存储的过程,该过程使用ROW_NUMBER()来分配目标表中的序列号。正如我所怀疑的,这可以通过添加排序转换,然后调整脚本转换来实现。我在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;
}
}
我在这里删去了帮助和注释,使代码更加简洁易读。谢谢。我以为我已经在我的问题中提出了我希望避免对SQL进行更改,但我想不会+1尽管回答了这个问题(尽管我会在这里改变顺序)。
SELECT
ROW_NUMBER() OVER(PARTITION BY ReportName ORDER BY ReportName) As Sequence,
ReportName,
GroupName,
FROM ReportGroups