我有一张类似于此的表格:
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转换,然后添加代码来检查报告名称的变化(?)有没有人做过这样的事情?要分享的任何示例代码?
答案 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