SSIS使用sql select的结果更新列

时间:2017-10-12 13:58:34

标签: sql ssis

我想知道是否有办法通过在每一行上运行select来更新数据流任务中的列?

以下是这种情况:

enter image description here

让我们把它作为我们的起始位置。我从2个文件中收集信息,然后合并它们,然后我添加了一个带有派生列工具的列。有没有办法通过使用行的值在每一行上执行选择来填充此列?

前:

SELECT Count(*) AS cnt
FROM TABLE T 
WHERE T.COLUMN1 = ROW.COLUMN3 
AND T.COLUMN2 = ROW.COLUMN5

我不知道我是不是没有正确地说出我的需要,但我无法获得任何结果

谢谢

3 个答案:

答案 0 :(得分:1)

您应该可以使用查找转换来执行此操作。

根据评论编辑:

如果由于表的大小而不想使用查找,则可以使用脚本组件完全执行所需操作。您可以为数据流的每一行创建和执行SQL命令,就像在任何.net应用程序中一样。

答案 1 :(得分:1)

我能够使用脚本组件

1-我已删除派生列

enter image description here

2-我创建了一个字符串变量,我在其中存储了一个通配符字符串,以替换我需要从该行获取的每个值。

3-我已经传递了这个变量allong,其中一个包含连接字符串信息到脚本组件

4-我已经在脚本组件的输出列中添加了一个新列

enter image description here

5-添加using System.Data.OleDb;

6-创建了2个变量:

string jourFerieQuery;
string dbcsoledbschema;

7-更新了PostExecute()以将我的SSIS变量的值放入脚本变量中:

public override void PostExecute()
    {
        base.PostExecute();
        jourFerieQuery = Variables.jourFerieQuery;
        dbcsoledbschema = Variables.dbcsoledbschema;
    }

8-增加了一种方法:

int GetData(string cs, string query)
    {
        OleDbConnection conn = new OleDbConnection(cs);
        conn.Open();
        OleDbCommand cmd = new OleDbCommand(query, conn);

        DataTable dt = new DataTable();
        dt.Load(cmd.ExecuteReader());
        conn.Close();
        return (int)dt.Rows[0][0];
    }

9-更新了Input0_ProcessInputRow(Input0Buffer Row):

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        string query = jourFerieQuery.Replace("[1]", Row.CODDEVI).Replace("[2]", Row.DATCRBEZEROCONGE.ToString());
        Row.Keep = GetData(dbcsoledbschema, query);
    }

我的查询返回一个计数,这就是我添加的方法返回int的原因

答案 2 :(得分:1)

您可以通过脚本组件(转换)来实现。

添加Ct。

的输出

我使用System.Data.OleDB,因为它匹配SSIS包连接字符串。