我想问一下如何将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
在这种情况下,@ wayMany最后应该是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变量?
答案 0 :(得分:5)
在Derived Column
之前使用OLE DB Command
转换,并将变量作为新列添加到数据流中。然后使用新列作为OLE DB Command
中的第三个参数。
根据更新的问题进行编辑:
好的,要做你想做的事,你可以使用脚本组件。 Here就是一个例子。如果NAME列不为null,则增加脚本中howMany
变量的值,然后将该变量的值添加为第三列。
第二次编辑:
要更新脚本中SSIS变量的值,请确保在脚本属性中将变量设置为读/写变量,这与上面链接的文章不同。然后:
Dts.Variables["howMany"].Value = nameCounter;
答案 1 :(得分:0)
因为您已经提到@howMany
变量是输出变量,所以您需要在OUTPUT
变换中使用OLE DB Command
子句。
EXEC [dbo].[CalculateProcess] ?,?,? OUTPUT
正如Tab Alleman建议在OLE DB Command
转换之前和Column Mapping
转换的OLE DB Command
标签中添加派生列,将其映射到派生列。
现在您已经提到过您还需要更新行的总和。
您可以在Derived列的Aggregate
和OLE DB Command
之后添加Sum
转换而不进行分组,这将为您提供更新的总行数。
更新
这里你问的是,你的存储过程没有正确的逻辑,你的@Howmany变量总是为null,除非你在运行时传递一个值,因为你拥有的唯一值是ID和Name在这种情况下,您的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