【问题标题】:SSIS package Execute SQL task dynamic SQL (not SP) with multiple returns but only capture final variableSSIS包执行SQL任务动态SQL(非SP),多次返回但只捕获最终变量
【发布时间】:2020-05-08 22:05:00
【问题描述】:

我有一个正在执行动态 SQL 的 SSIS 包。动态 SQL 有时会有结果集,有时没有,但我只想捕获 COUNT,它是下面脚本中的返回值。

(或者我可以使用 C# 脚本任务来完成此任务吗?),我知道我可以遍历 C# 中的记录集,但我不会总是有 2 个,有没有办法通过名称或其他东西来区分结果集,或者仅通过结果集 [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 中都可以正常工作,并从动态 SQL 和计数返回结果集,但我只想将 COUNT 返回到 SSIS 中的变量中。

如果我使用结果集,我会收到单行错误(因为动态 sql 可以返回结果和计数)。

我这样做的三个原因,而不是使用 SP 或其他方式,但我的问题不需要这些细节。

我怎样才能只捕获@ReturnRowsEffectedA 的值?

【问题讨论】:

  • 您应该能够在Execute SQL TaskParameter Mapping 窗格中将@ReturnRowsEffectedA 配置为输出参数。 sqlserverrider.wordpress.com/2014/08/31/… 有一个简单的例子
  • 我尝试了一些变体,但我运行以返回计数的代码不是 SP,因此没有官方 RETURN 语句,我无法从不在 SP 中的选择执行 RETURN(即我找到了),上面的代码必须在没有 SP 的情况下以这种方式运行。所以 SSIS 中的输出参数不起作用。
  • 如果你只想要计数,你就不能改变你构建的动态sql,使其不返回第一组记录吗?

标签: c# sql-server ssis dataset sp-executesql


【解决方案1】:

您可以使用输出参数来执行此操作。首先,创建一个保存该值的 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,然后映射变量的结果。

【讨论】:

  • 这很完美!谢谢。我之前发现这是一个选项,但它与我的场景不够接近,所以我一定没有正确实现它,你的例子是完美的!再次感谢!!
  • 嘿,这对我很有用,但我现在有一个问题,有没有办法设置输出到 OBJECT 的参数?我没有找到一种方法来做到这一点。原因是输出是一个比 varchar(8000) 长的字符串,并且它被截断了,我知道如何解决这个问题,但我需要输出到一个对象来这样做。
  • @Brad 您可以将ResultSet 值更改为Full result set,然后在Result Set 窗格中,添加一个将Result Name of 0 映射到您的对象变量的条目.请参阅我添加到答案中的屏幕截图以供参考。
  • 我的代码与上面略有不同,我没有输出 2 个具有不同值的变量,所以我想我应该能够删除输出参数,并像你一样使用 to 对象来完整结果集有上面,然后在 C# 代码中(这部分是截断长字符串所必需的),循环遍历结果集并将它们保存到正确的变量中?我可以搜索如何在 c# 中执行此操作,但是即使一个结果集为空/空白,这是否有效?它仍然是一个结果集,正确
  • 没错。如果您的 proc 输出 NULL/空白记录集,则该记录集应该存在于 ADO 对象变量中。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
相关资源
最近更新 更多