【发布时间】:2016-07-07 08:19:56
【问题描述】:
我正在尝试从 sql server 的表中获取 CSV ID,并将结果分配给变量。下面是我放在 Execute SQL Task
中的 sqlset 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 任务的设置
- 在常规选项卡中,结果集项目设置为单行
- 在 结果集 选项卡中,结果名称设置为 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