首页 文章

通过OLE DB命令将SSIS变量值作为SP的参数传递

提问于
浏览
2

我想问一下如何将SSIS变量作为数据流中OLE DB命令使用的存储过程的参数传递?

我试图将以下内容编写为SQL命令,但不能正常工作:EXEC [dbo] . [CalculateProcess]?,?,?

收到错误:

没有给出一个或多个必需参数的值 .

第一个和第二个值(?值)来自Flat File Source作为ID和NAME . 第三个应该是SSIS变量@howMany的值 . 我该怎么做?感谢帮助 .

编辑:

让我们假设我的数据集是:

ID NAME
1  X
2  Y
3  Z
4  
5  A

在这种情况下,@howMany最后应该是4 . 如果当前NAME不为null,则应在每个OLE DB命令工作后动态更新该值 .

ID NAME
1  X
@howMany = 1

2  Y
@howMany = 2

3  Z
@howMany = 3

4  
@howMany = 3

5  A
@howMany = 4

编辑2:当我将@howMany添加为派生列时,它发生如下:

ID NAME @howMany
1  X    0
2  Y    0 
3  Z    0
4       0
5  A    0

0值保持不变,每行后都没有更新 . 之后写OUTPUT?在SQL命令中没有解决它?我的错误在哪里?

编辑3:存储过程是 -

CREATE PROCEDURE [dbo].[CalculateProcess]
    @ID int,
    @name varchar(30),
    @howMany int output
AS
BEGIN
    SET NOCOUNT ON;
    if (@name is not null)
    BEGIN
        set @howMany = @howMany + 1;
    END
END

编辑4:我在获得平面文件源后立即添加了一个脚本组件 . Name是INPUT参数,NameCounter是我的输出列 . 我的脚本是:

private int nameCounter;
public override void PreExecute()
{
    nameCounter= 0;
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (Row.Name != null)
    {
        nameCounter++;

    }
    Row.NameCounter= nameCounter;
}

脚本组件连接到我的OLE DB命令 . 这将生成一个名为NameCounter的列,并将其添加到OLE DB命令中的所有数据 . 现在我只是不知道如何在这里获取NameCounter的值并将其分配给SSIS变量?

2 回答

  • 5

    OLE DB Command 之前使用 Derived Column 转换,并将该变量作为新列添加到数据流中 . 然后使用新列作为 OLE DB Command 中的第三个参数 .

    编辑基于更新的问题:

    好的,要做你想做的事,你可以使用脚本组件 . Here就是一个例子 . 如果NAME列不为null,则增加脚本中 howMany 变量的值,然后将该变量的值添加为第三列 .

    第二编辑:

    要更新脚本中SSIS变量的值,请确保在脚本属性中将变量设置为读/写变量,这与上面链接的文章不同 . 然后:

    Dts.Variables["howMany"].Value = nameCounter;
    
  • 0

    因为您已经提到 @howMany 变量是输出变量,所以您需要在 OLE DB Command 变换中使用 OUTPUT 子句 .

    EXEC [dbo].[CalculateProcess] ?,?,? OUTPUT
    

    正如Tab Alleman建议在 OLE DB Command 转换之前和 OLE DB Command 转换的 Column Mapping 选项卡中添加派生列,将其映射到派生列 .

    现在您已经提到过您还希望更新行的总和 .

    您可以在派生列上的 OLE DB CommandSum 之后添加 Aggregate 转换而不进行分组,这将为您提供更新的总行数 .

    Update

    这里你问的是,你的存储过程没有正确的逻辑,你的@Howmany变量总是为null,除非你在运行时传递一个值,因为你拥有的唯一值是ID和你的Howmany变量的名称在这种情况下,它将始终为null .

    您的存储过程逻辑是错误的,它应该像......

    CREATE PROCEDURE [dbo].[CalculateProcess]
        @ID int,
        @name varchar(30),
        @howMany int output
    AS
    BEGIN
        SET NOCOUNT ON;
    
       Update TableName --<-- whatever your table name is 
        SET Name = @name 
       WHERE ID = @ID 
        AND  Name IS NOT NULL     
    
    set @howMany = @@ROWCOUNT;
    
    END
    

相关问题