2012-03-01 82 views
0

我正在使用SSIS從表中讀取數據,修改列並將其插入新表中。SSIS數據操作

如果先前讀取的行在特定列中具有相同的值,我想要執行的修改將發生。

我最初的想法是使用一個c#腳本,其中包含一個字典,其中包含以前讀取的值以及已經看到的次數。

我的問題是我無法將字典另存爲SSIS變量。是否可以在SSIS腳本組件中保存C#變量?還是有另一種方法可以用來實現這一點。

作爲一個例子,下面

/--------------------------------\ 
| Unique Column | To be modified | 
|--------------------------------| 
| X5FG  |  0   | 
| QFJD  |  0   | 
| X5FG  |  0   | 
| X5FG  |  0   | 
| DFHG  |  0   | 
| DDFB  |  0   | 
| DDFB  |  0   | 

的數據將被轉換成

/--------------------------------\ 
| Unique Column | To be modified | 
|--------------------------------| 
| X5FG  |  0   | 
| QFJD  |  0   | 
| X5FG  |  1   | 
| X5FG  |  2   | 
| DFHG  |  0   | 
| DDFB  |  0   | 
| DDFB  |  1   | 
+0

是您的源的SQL Server 2005+或Oracle數據庫?如果是這樣,您可以在源查詢中生成 – billinkc 2012-03-01 15:39:03

回答

1

而不是使用遊標,只使用一套基於statment

假設SQL 2005+或Oracle,使用ROW_NUMBER函數在源查詢像這樣。重要的是要注意的是PARTITION BY定義你的小組/當數字重新啓動時。該ORDER BY子句可指示在數字應用(最新MOD日期,最早的第一,最高的薪水,等等)的順序

SELECT 
    D.* 
, ROW_NUMBER() OVER (PARTITION BY D.unique_column ORDER BY D.unique_column) -1 AS keeper 
FROM 
(
    SELECT 'X5FG' 
    UNION ALL SELECT 'QFJD' 
    UNION ALL SELECT 'X5FG' 
    UNION ALL SELECT 'X5FG' 
    UNION ALL SELECT 'DFHG' 
    UNION ALL SELECT 'DDFB' 
    UNION ALL SELECT 'DDFB' 
) D (unique_column) 

結果

unique_column  keeper 
DDFB    0 
DDFB    1 
DFHG    0 
QFJD    0 
X5FG    0 
X5FG    1 
X5FG    2 
0

可以創建一個腳本部件。給出選擇時,選擇行轉換(而不是源或目標)。

在腳本中,您可以創建一個全局變量,您將在進程行方法中更新該變量。

0

也許SSIS不是這個任務的解決方案。使用帶有表值變量的遊標可以實現相同的結果。在大多數情況下,我並不喜歡遊標,但是當你需要迭代依賴於以前迭代的數據或者自我依賴的時候,它會很有用。這裏有一個例子:

DECLARE 
    @value varchar(4) 
    ,@count int 
DECLARE @dictionary TABLE (value varchar(4), count int) 
DECLARE cur CURSOR FOR 
    (SELECT UniqueColumn FROM SourceTable s) 

OPEN cur; 

FETCH NEXT FROM cur INTO @value; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
DECLARE @innerCount int = 0 

    IF NOT EXISTS (SELECT 1 FROM @dictionary WHERE value = @value) 
     BEGIN 
      INSERT INTO @dictionary (value, count) 
       VALUES(@value, 0) 
     END 
    ELSE 
     BEGIN 
      SET @innerCount = (SELECT count + 1 FROM @dictionary WHERE value = @value) 

      UPDATE @dictionary 
       SET count = @innerCount 
       WHERE value = @value 
     END 

    INSERT INTO TargetTable (value, count) 
     VALUES (@value, @innerCount) 

    FETCH NEXT FROM cur INTO @value; 
END