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

Assigning value from single row result set in ssis giving error in SSIS 2012

我正在尝试从 sql 服务器的 table 获取 CSV ID,并将结果分配给一个变量。下面是我放在 Execute SQL Task

里面的 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

如您所见,这是一种获取 t-sql 字段的 csv 的简单标准方法。它在查询 window 中完美运行,但是当我 运行 SSIS 2012 中的任务

时抛出以下错误

[Execute SQL Task] Error: The value type (__ComObject) can only be converted to variables of type Object.

[Execute SQL Task] Error: An error occurred while assigning a value to variable "sCSVCompanyIds": "The type of the value (DBNull) being assigned to variable "User::sCSVCompanyIds" differs from the current variable type (String). Variables may not change type during execution. Variable types are strict, except for variables of type Object. ".

下面是Execute SQL Task

的设置
  1. 常规 选项卡中,结果集项目设置为单行
  2. Result Set 选项卡中,Result Name 设置为 0(我也尝试将其设置为 csvids,这是 select 列表)和变量名称设置为 User::sCSVCompanyIds

我不知道为什么它不起作用。在浪费了这么多时间之后,我想出了一个艰难的方法,通过将结果返回为完整行集(相同 SQL 其中 returns 1 行 1 列总是)并为每个循环容器添加一个循环抛出结果集(由于显而易见的原因,它总是只迭代一次)并将结果集的字段分配给变量。它对我有用,但应该有简单的方法来做到这一点。我缺少什么?

问题出在 nvarchar(max) 数据类型上。我认为 varchar(max) 也是一样的。尽管 SSIS 中的相关数据类型是 DT_NTEXT 并且由于某种原因存在 DT_TEXT,但我们收到此错误。

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

一个 当然,可能有更合适的方法来处理这个问题,方法是 cast/converting 将查询中的列设置为固定长度而不是最大长度,例如 cast(myvarcharmaxfield as varchar(8000))。就我而言,它不起作用,因为我希望字符串长度更大。我从一个唯一标识符列生成一个 csv 字符串,它本身是 36 个字符长的字符串,需要 3 个额外的字符来用单引号和逗号作为分隔符引用它们,这将只支持 205 个值。所以它对我不起作用。

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

After wasting so much time I am worked out a hard way which by returning the result as Full Row set (same SQL which returns 1 row 1 column always) and add a for each loop container to loop throw the result set (which will always iterates only once for obvious reasons) and assign the result set's fields to the variable

我学到的新方法来自 this question

的一个未被接受的答案

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

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