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

时间:2016-07-07 08:19:57

标签: 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

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

  

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

     

[执行SQL任务]错误:分配值时发生错误   变量" sCSVCompanyIds":"值的类型(DBNull)正在   分配给变量" User :: sCSVCompanyIds"与现在不同   变量类型(String)。变量期间可能不会更改类型   执行。变量类型是严格的,除了类型的变量   宾语。 "

以下是执行SQL任务的设置

  1. 常规标签中,Resultset项目设置为单行
  2. 结果集标签中,结果名称设置为0(我也尝试将其设置为csvids,这是选择列表中的别名列名称)并设置了变量名称到User::sCSVCompanyIds
  3. 我不知道为什么它不起作用。在浪费了这么多时间之后,我通过将结果作为Full Row集返回(同样的SQL总是返回1行1列)并为每个循环容器添加一个循环抛出结果集(将始终迭代)只有一次出于显而易见的原因)并将结果集的字段分配给变量。它适用于我,但应该有简单的方法。我缺少什么?

1 个答案:

答案 0 :(得分:7)

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

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

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

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

  

在浪费了这么多时间之后,我正在努力解决这个问题   将结果作为Full Row集返回(相同的SQL返回1行1   列总是)并为每个循环容器添加一个循环抛出   结果集(由于显而易见的原因,它总是只迭代一次)   并将结果集的字段分配给变量

我学到的新方法来自this question

的未接受答案

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

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