SSIS 包执行 SQL 任务动态 SQL(不是 SP)与多个 returns 但只捕获最终变量
SSIS package Execute SQL task dynamic SQL (not SP) with multiple returns but only capture final variable
我有一个正在执行动态 SQL 的 SSIS 包。动态 SQL 有时会有结果集,有时没有,但我只想捕获 COUNT,这是下面脚本中的 returned 值。
(或者我可以使用 C# 脚本任务来完成这个吗?),我知道我可以在 C# 中循环遍历记录集,但我不会总是有 2 个,有没有办法通过名称或其他方式区分结果集, 或者仅通过 resultset[x]?
中的数组索引
-- These are passed values in SSIS as paramaters
DECLARE @VariablePassedForSelect AS VARCHAR(50) = ?
DECLARE @ScriptToExecute NVARCHAR(MAX) = ?
-- putting return value count from dynamic script into variable
DECLARE @ReturnRowsEffectedA INT
-- this MAY (or may not) return a result set as dynaic code
exec sp_executesql @ScriptToExecute, N'@VariablePassedForSelect BIGINT, @ReturnRowsEffected INT OUTPUT', @VariablePassedForSelect = @VariablePassedForSelect, @ReturnRowsEffected = @ReturnRowsEffectedA OUTPUT
-- now select results for returning,this is only value I want
SELECT @ReturnRowsEffectedA AS RowCountR
所有这一切在 SQL 和 returns 来自动态 SQL 和计数的结果集中工作正常,但我只想将 COUNT returned 到SSIS 中的一个变量。
如果我使用结果集,我会得到单行错误(因为动态 sql 可以 return 结果和计数)。
我这样做而不是使用 SP 或其他方式的三个原因,但我的问题不需要这些细节。
如何才能只捕获 @ReturnRowsEffectedA 的值?
您可以使用输出参数执行此操作。首先,创建一个将保存该值的 SSIS 变量。我将使用您已有的名称并将此变量命名为 [User::ReturnRowsEffectedA]
。您在实际查询中不需要 @ReturnRowsEffectedA。您可以保持大部分查询文本相同,但将 sp_execute 调用中的 @ReturnRowsEffectedA
替换为 ?
以表示我们将使用 SSIS 参数变量。您执行 SQL 查询将如下所示:
-- These are passed values in SSIS as paramaters
DECLARE @VariablePassedForSelect AS VARCHAR(50) = ?
DECLARE @ScriptToExecute NVARCHAR(MAX) = ?
-- this MAY (or may not) return a result set as dynaic code
exec sp_executesql @ScriptToExecute, N'@VariablePassedForSelect BIGINT, @ReturnRowsEffected INT OUTPUT', @VariablePassedForSelect = @VariablePassedForSelect, @ReturnRowsEffected = ? OUTPUT
然后在您的 Parameter Mapping
中,您将添加第三个条目(前两个将是您的输入参数,用于输入 @VariablePassedForSelect 和 @ScriptToExecute)。您将使用 [User::ReturnRowsEffectedA]
作为 Variable Name
,将 Direction
设置为 Output
,并将 Parameter Name
更改为 2
。您可以将数据类型设置为 LONG
,将大小设置为 -1
。
我在我的系统上创建了一个示例来说明它是如何工作的:
这是我的查询。为简单起见,我不传递脚本。但它仍然使用输入和输出参数。
在这里你可以看到我将 ResultSet
设置为 None
:
Execute SQL Task
只用了一个参数,所以这里的Parameter Name
是0
。
我在任务完成后暂停了执行,所以你可以看到 [User::ResultVar]
填充了 1
的值,这是这里的预期值。
编辑:要将 proc 的结果添加到 SSIS 中的对象类型变量,您首先要创建一个对象类型变量,然后设置 ResultSet
属性到 Full result set
,然后将结果映射到变量。
我有一个正在执行动态 SQL 的 SSIS 包。动态 SQL 有时会有结果集,有时没有,但我只想捕获 COUNT,这是下面脚本中的 returned 值。
(或者我可以使用 C# 脚本任务来完成这个吗?),我知道我可以在 C# 中循环遍历记录集,但我不会总是有 2 个,有没有办法通过名称或其他方式区分结果集, 或者仅通过 resultset[x]?
中的数组索引-- These are passed values in SSIS as paramaters
DECLARE @VariablePassedForSelect AS VARCHAR(50) = ?
DECLARE @ScriptToExecute NVARCHAR(MAX) = ?
-- putting return value count from dynamic script into variable
DECLARE @ReturnRowsEffectedA INT
-- this MAY (or may not) return a result set as dynaic code
exec sp_executesql @ScriptToExecute, N'@VariablePassedForSelect BIGINT, @ReturnRowsEffected INT OUTPUT', @VariablePassedForSelect = @VariablePassedForSelect, @ReturnRowsEffected = @ReturnRowsEffectedA OUTPUT
-- now select results for returning,this is only value I want
SELECT @ReturnRowsEffectedA AS RowCountR
所有这一切在 SQL 和 returns 来自动态 SQL 和计数的结果集中工作正常,但我只想将 COUNT returned 到SSIS 中的一个变量。
如果我使用结果集,我会得到单行错误(因为动态 sql 可以 return 结果和计数)。
我这样做而不是使用 SP 或其他方式的三个原因,但我的问题不需要这些细节。
如何才能只捕获 @ReturnRowsEffectedA 的值?
您可以使用输出参数执行此操作。首先,创建一个将保存该值的 SSIS 变量。我将使用您已有的名称并将此变量命名为 [User::ReturnRowsEffectedA]
。您在实际查询中不需要 @ReturnRowsEffectedA。您可以保持大部分查询文本相同,但将 sp_execute 调用中的 @ReturnRowsEffectedA
替换为 ?
以表示我们将使用 SSIS 参数变量。您执行 SQL 查询将如下所示:
-- These are passed values in SSIS as paramaters
DECLARE @VariablePassedForSelect AS VARCHAR(50) = ?
DECLARE @ScriptToExecute NVARCHAR(MAX) = ?
-- this MAY (or may not) return a result set as dynaic code
exec sp_executesql @ScriptToExecute, N'@VariablePassedForSelect BIGINT, @ReturnRowsEffected INT OUTPUT', @VariablePassedForSelect = @VariablePassedForSelect, @ReturnRowsEffected = ? OUTPUT
然后在您的 Parameter Mapping
中,您将添加第三个条目(前两个将是您的输入参数,用于输入 @VariablePassedForSelect 和 @ScriptToExecute)。您将使用 [User::ReturnRowsEffectedA]
作为 Variable Name
,将 Direction
设置为 Output
,并将 Parameter Name
更改为 2
。您可以将数据类型设置为 LONG
,将大小设置为 -1
。
我在我的系统上创建了一个示例来说明它是如何工作的:
这是我的查询。为简单起见,我不传递脚本。但它仍然使用输入和输出参数。
在这里你可以看到我将 ResultSet
设置为 None
:
Execute SQL Task
只用了一个参数,所以这里的Parameter Name
是0
。
我在任务完成后暂停了执行,所以你可以看到 [User::ResultVar]
填充了 1
的值,这是这里的预期值。
编辑:要将 proc 的结果添加到 SSIS 中的对象类型变量,您首先要创建一个对象类型变量,然后设置 ResultSet
属性到 Full result set
,然后将结果映射到变量。