2017-07-06 58 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)。 –