2012-03-01 18 views
0

現在、SSISを使用してテーブルからデータを読み取り、列を変更して新しいテーブルに挿入します。SSISデータ操作

以前に読み込んだ行が特定の列に同じ値を持つ場合、実行したい変更が行われます。

私の元のアイデアは、以前に読み取られた値とそれが何回見られたのかを含む辞書を持つC#スクリプトを使用することでした。

私の問題は、辞書をSSIS変数として保存できないということです。 C#変数をSSISスクリプトコンポーネントの中に保存することは可能ですか?または私はこれを達成するために使用できる別の方法があります。

例として、

/--------------------------------\ 
| 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

答えて

1

カーソルを使用するのではなく、ちょうどそのようなあなたのソースクエリにROW_NUMBER関数を使用し、セットベースなステートメント

と仮定すると、SQL 2005+またはOracleを使用しています。注目すべき重要なことは、PARTITION BYがあなたのグループ/番号が再開されるときを定義することです。 ORDER BY節は番号が適用される順序(最も最近のモッズ日付、古い順、最高給与など)

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はこの1つのタスクの解決策ではありません。テーブル値変数を持つカーソルを使用すると、同じ結果を達成することができます。私はほとんどの状況でカーソルのファンではありませんが、以前の反復に依存するデータを反復処理する必要がある場合、または自立している場合は、それが役に立ちます。ここでは例を示します。

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