通过 OLE DB 命令将 SSIS 变量值作为 SP 的参数传递
Passing an SSIS variable value as a parameter of SP via OLE DB Command
请问如何在数据流中通过 OLE DB 命令将 SSIS 变量作为参数传递给使用的存储过程?
我正在尝试将以下内容编写为 SQL 命令,但无法正常工作:
执行 [dbo].[计算过程] ?,?,?
收到错误:
No value given for one or more required parameters.
第一个和第二个值(?值)作为 ID 和名称来自平面文件源。第三个应该是 SSIS 变量@howMany 的值。我该怎么做?感谢您的帮助。
编辑:
假设我的数据集是:
ID NAME
1 X
2 Y
3 Z
4
5 A
在这种情况下,@howMany 最后应该是 4。如果当前 NAME 不为空,则应在每个 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 变量?
在 OLE DB Command
之前使用 Derived Column
转换,并将变量作为新列添加到数据流中。然后使用新列作为 OLE DB Command
.
中的第三个参数
根据更新的问题进行编辑:
好的,要执行您想要的操作,您可以使用脚本组件。 Here 就是一个例子。如果 NAME 列不为空,则在脚本中增加 howMany
变量的值,然后将变量的值添加为第三列。
第二次编辑:
要在脚本中更新 SSIS 变量的值,请务必在脚本属性中将该变量设置为 Read/Write 变量,这与我上面链接的文章不同。那么:
Dts.Variables["howMany"].Value = nameCounter;
既然您已经提到 @howMany
变量是一个输出变量,那么您需要在 OLE DB Command
转换中使用 OUTPUT
子句。
EXEC [dbo].[CalculateProcess] ?,?,? OUTPUT
正如 Tab Alleman 建议的那样,在 OLE DB Command
转换之前添加派生列,并在 OLE DB Command
转换的 Column Mapping
选项卡中将其映射到派生列。
现在您已经提到您还希望更新行的总和。
您可以在没有分组的派生列上的 OLE DB Command
和 Sum
之后添加一个 Aggregate
转换,这将为您提供更新的总行数。
更新
这就是问题所在,您的存储过程没有正确的逻辑,您的@Howmany 变量始终为空,除非您在 运行 时向它传递一个值,因为唯一的值是您have 是 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
请问如何在数据流中通过 OLE DB 命令将 SSIS 变量作为参数传递给使用的存储过程?
我正在尝试将以下内容编写为 SQL 命令,但无法正常工作: 执行 [dbo].[计算过程] ?,?,?
收到错误:
No value given for one or more required parameters.
第一个和第二个值(?值)作为 ID 和名称来自平面文件源。第三个应该是 SSIS 变量@howMany 的值。我该怎么做?感谢您的帮助。
编辑:
假设我的数据集是:
ID NAME
1 X
2 Y
3 Z
4
5 A
在这种情况下,@howMany 最后应该是 4。如果当前 NAME 不为空,则应在每个 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 变量?
在 OLE DB Command
之前使用 Derived Column
转换,并将变量作为新列添加到数据流中。然后使用新列作为 OLE DB Command
.
根据更新的问题进行编辑:
好的,要执行您想要的操作,您可以使用脚本组件。 Here 就是一个例子。如果 NAME 列不为空,则在脚本中增加 howMany
变量的值,然后将变量的值添加为第三列。
第二次编辑:
要在脚本中更新 SSIS 变量的值,请务必在脚本属性中将该变量设置为 Read/Write 变量,这与我上面链接的文章不同。那么:
Dts.Variables["howMany"].Value = nameCounter;
既然您已经提到 @howMany
变量是一个输出变量,那么您需要在 OLE DB Command
转换中使用 OUTPUT
子句。
EXEC [dbo].[CalculateProcess] ?,?,? OUTPUT
正如 Tab Alleman 建议的那样,在 OLE DB Command
转换之前添加派生列,并在 OLE DB Command
转换的 Column Mapping
选项卡中将其映射到派生列。
现在您已经提到您还希望更新行的总和。
您可以在没有分组的派生列上的 OLE DB Command
和 Sum
之后添加一个 Aggregate
转换,这将为您提供更新的总行数。
更新
这就是问题所在,您的存储过程没有正确的逻辑,您的@Howmany 变量始终为空,除非您在 运行 时向它传递一个值,因为唯一的值是您have 是 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