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
正如您可以看到它在t-sql中获取字段的csv的简单而标准的方法.它在查询窗口中完美运行,但在我在SSIS 2012中运行任务时抛出以下错误
[执行SQL任务]错误:值类型(__ComObject)只能转换为Object类型的变量.
[执行SQL任务]错误:为变量"sCSVCompanyIds"赋值时发生错误:"分配给变量"User :: sCSVCompanyIds"的值(DBNull)的类型与当前变量类型(String)不同.在执行期间可能不会改变类型.变量类型是严格的,除了Object类型的变量."
以下是执行SQL任务的设置
csvids为选择列表中的别名列名称),并将"变量名称"设置为User::sCSVCompanyIds我不知道为什么它不起作用.在浪费了这么多时间之后,我通过将结果作为Full Row集返回(同样的SQL总是返回1行1列)并为每个循环容器添加一个循环抛出结果集(将始终迭代)只有一次出于显而易见的原因)并将结果集的字段分配给变量.它适用于我,但应该有简单的方法.我错过了什么?
问题在于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不同.
| 归档时间: | 
 | 
| 查看次数: | 7402 次 | 
| 最近记录: |