【问题标题】:Assigning value from single row result set in ssis giving error in SSIS 2012从 ssis 中的单行结果集中分配值,在 SSIS 2012 中给出错误
【发布时间】:2016-07-07 08:19:56
【问题描述】:

我正在尝试从 sql server 的表中获取 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 的简单而标准的方法。它在查询窗口中完美运行,但当我在 SSIS 2012 中运行任务时抛出以下错误

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

[执行 SQL 任务] 错误:将值分配给 variable "sCSVCompanyIds": "值的类型 (DBNull) 是 分配给变量“User::sCSVCompanyIds”的变量与当前变量不同 变量类型(字符串)。变量在期间可能不会改变类型 执行。变量类型是严格的,除了类型变量 目的。 ”。

以下是执行 SQL 任务的设置

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

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

【问题讨论】:

  • 尝试在select子句中添加AS select... cast(id AS varchar(10)) + ',' from ... 当我运行代码时返回错误
  • @alex 谢谢,请忽略该错误。当我更改实际表/列时,我不小心删除了它。现已更正
  • 你把window Variables中的DataType设置为String了吗?
  • 分配给变量“User::sCSVCompanyIds”的值的类型(DBNull)与当前的变量类型(字符串)不同意味着可能没有返回任何内容(NULL ) 并且它不喜欢它。您是否尝试在表达式中添加ISNULL?我发现将参数和输出分配给执行任务非常有限且有问题。
  • 尝试为选项卡中的变量分配一个默认值,例如“文件名”

标签: sql-server ssis ssis-2012


【解决方案1】:

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

有多种方法可以处理这个问题。

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

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

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

我学到的新方法来自this question的一个未被接受的答案

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2017-01-06
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多