Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SSIS包使用多个返回执行SQL任务动态SQL(非SP),但仅捕获最终变量_C#_Sql Server_Ssis_Dataset_Sp Executesql - Fatal编程技术网

C# SSIS包使用多个返回执行SQL任务动态SQL(非SP),但仅捕获最终变量

C# SSIS包使用多个返回执行SQL任务动态SQL(非SP),但仅捕获最终变量,c#,sql-server,ssis,dataset,sp-executesql,C#,Sql Server,Ssis,Dataset,Sp Executesql,我有一个正在执行动态SQL的SSIS包。动态SQL有时有结果集,有时没有,但我只想捕获计数,这是下面脚本中返回的值 (或者我可以使用C#脚本任务来完成这个任务吗?),我知道我可以循环使用C#中的记录集,但我不会总是有2个,有没有办法通过名称或其他什么来区分结果集的差异,或者只通过结果集[x]中数组的索引来区分 -- These are passed values in SSIS as paramaters DECLARE @VariablePassedForSelect AS VARCHAR(5

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

(或者我可以使用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和计数返回结果集,但我只希望将计数返回到SSIS中的变量中

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

三个原因是我这样做,不使用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
然后在
参数映射中添加第三个条目(前两个是输入参数,分别为@VariablePassedForSelect和@ScriptToExecute提供数据)。您将使用
[User::ReturnRowsEffectedA]
作为
变量名
,将
方向
设置为
输出
,并将
参数名
更改为
2
。您可以将数据类型设置为
LONG
,将大小设置为
-1

我在我的系统上创建了一个示例来说明其工作原理: 这是我的问题。为了简单起见,我不传递脚本。但它仍然使用输入和输出参数。

在这里,您可以看到我将
ResultSet
设置为
None

executesql任务
只使用一个参数,因此这里的
参数名
0

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

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


您应该能够将
@ReturnRowsEffectedA
配置为
执行SQL任务
参数映射
窗格中的输出参数。在上有一个简单的例子,我尝试了它的一些变体,但我正在运行的返回计数的代码不是SP,因此没有正式的返回语句,并且我无法从select not in SP(我发现的)返回,并且上面的代码必须在没有SP的情况下以这种方式运行。因此SSIS中的输出参数无法工作。如果您只需要计数,难道你不能改变你构建的动态sql,这样它就不会返回第一组记录了吗?这非常有效!非常感谢。我以前发现这是一个选项,但它与我的场景不够接近,所以我一定没有正确地实现它,您的示例非常完美!!再次感谢!!嘿,这对我来说很有效,但我现在有个问题,有没有办法设置输出到对象的参数?我没有找到这样做的方法。原因是输出是一个比varchar(8000)长的字符串,它正在被截断,我知道如何解决这个问题,但我需要输出到一个对象才能这样做。@Brad您可以将
ResultSet
值更改为
Full result set
,然后在
result set
窗格中,您需要添加一个条目,将0的
结果名
映射到您的对象变量。请参阅我添加到答案中的屏幕截图以供参考。我的代码与上面的代码略有不同,我没有输出两个具有不同值的变量,因此我认为我应该能够删除输出参数,并像上面一样使用to对象生成完整的结果集,然后在C#代码中使用(这部分是截断长字符串所必需的),循环遍历结果集并将其保存到正确的变量?我可以在c#中搜索如何执行此操作,但即使一个结果集为null/blank,这是否也可以工作?这仍然是一个结果集,没错。如果proc输出空/空记录集,则ADO对象变量中应存在该记录集。