2012-03-01 88 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