在ssis中为单行结果集分配值,从而在SSIS 2012中给出错误

Sol*_*per 2 sql-server ssis ssis-2012

我试图从SQL Server的表中获取CSV ID并将结果分配给变量.下面是我在执行SQL任务中放入的sql

set nocount on
declare @csv varchar(max) = ''
select @csv = @csv + cast(companyid as varchar(10)) + ',' from company where isprocessed = 0
select substring(@csv,1,len(@csv) - 1) as companyids
Run Code Online (Sandbox Code Playgroud)

正如您可以看到它在t-sql中获取字段的csv的简单而标准的方法.它在查询窗口中完美运行,但在我在SSIS 2012中运行任务时抛出以下错误

[执行SQL任务]错误:值类型(__ComObject)只能转换为Object类型的变量.

[执行SQL任务]错误:为变量"sCSVCompanyIds"赋值时发生错误:"分配给变量"User :: sCSVCompanyIds"的值(DBNull)的类型与当前变量类型(String)不同.在执行期间可能不会改变类型.变量类型是严格的,除了Object类型的变量."

以下是执行SQL任务的设置

  1. 在" 常规"选项卡中,"结果集"项目设置为单行
  2. 在" 结果集"选项卡中,"结果名称"设置为0(我也尝试将其设置csvids为选择列表中的别名列名称),并将"变量名称"设置为User::sCSVCompanyIds

我不知道为什么它不起作用.在浪费了这么多时间之后,我通过将结果作为Full Row集返回(同样的SQL总是返回1行1列)并为每个循环容器添加一个循环抛出结果集(将始终迭代)只有一次出于显而易见的原因)并将结果集的字段分配给变量.它适用于我,但应该有简单的方法.我错过了什么?

Sol*_*per 9

问题在于nvarchar(max)数据类型.我假设varchar(max)也是一样的.虽然SSIS中的相关数据类型是DT_NTEXT和DT_TEXT由于某种原因存在,但我们收到此错误.

有多种方法可以解决这个问题.

一个当然可能有更合适的方法来处理这个问题,方法是将查询中的列转换/转换为固定长度而不是像cast这样的最大值(myvarcharmaxfield as varchar(8000)).在我的情况下,它不起作用,因为我期望更长的字符串.我从一个唯一的标识符列生成一个csv字符串,该列本身是36个字符长的字符串,需要3个额外的字符,用引号引用它们和逗号作为分隔符,它只支持205个值.所以它对我不起作用.

所以我没有选择,只能坚持我已经实施的方式,这是我的问题

在浪费了这么多时间之后,我通过将结果作为Full Row集返回(同样的SQL总是返回1行1列)并为每个循环容器添加一个循环抛出结果集(将始终迭代)只有一次出于显而易见的原因)并将结果集的字段分配给变量

我学到的新方法来自这个问题的一个不可接受的答案

将Oledb连接更改为ADO.NET连接

我认为这是公平的,但它需要我创建另一个连接管理器(这样我就不必更改所有现有的任务)并将它用于我需要csv的这种类型的tak,但我没有买它,因为我有很少有时间研究创建它的连接字符串,在我看来,我得到的错误类型与oledb不同.