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 Name0

我在任务完成后暂停了执行,所以你可以看到 [User::ResultVar] 填充了 1 的值,这是这里的预期值。

编辑:要将 proc 的结果添加到 SSIS 中的对象类型变量,您首先要创建一个对象类型变量,然后设置 ResultSet 属性到 Full result set,然后将结果映射到变量。