在SSIS中分配String变量

时间:2014-06-24 15:29:55

标签: sql ssis

我在SSIS中有一个执行sql任务,我尝试存储一个字符串值

这是查询

Declare @IdList nvarchar(max)
select @IdList = coalesce( @IdList + ''',''', '') + ID from table
Select @IdList = '''' + @IdList 
Select @IdList

结果如

'abc','bcd','def','fds'

我尝试将此值存储到SSIS

中的String变量中
result set: single row
result name: 0 
Variable Name: String_Contact

这是我得到的错误

[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 "String_Contact": "The type of the value (DBNull) being assigned to variable "User::String_Contact" differs from the current variable type (String). Variables may not change type during execution. Variable types are strict, except for variables of type Object.

”。

任何人都知道这是什么问题?

感谢

2 个答案:

答案 0 :(得分:6)

尝试将变量的数据类型从String更改为Object。

如果将varchar(max)分配给字符串[SSIS]变量。由于SSIS中的字符串长度限制为8000个字符,因此可能存在溢出错误。

但您可以将nvarchar(max)指定给Object。

您可以使用For Each Loop Container设置枚举器作为"对于每个ADO枚举器"来处理对象。或者通过Script Task as

 DataTable dt = new DataTable();
OleDbDataAdapter oleDa = new OleDbDataAdapter();
oleDa.Fill(dt, Dts.Variables["User::variable"].Value);

将dt用作常规DataTable。

资源:

How To Read Object Type Variable In Script Task

Using the SSIS Object Variable as a Result Set Enumerator

Execute SQL Task into an object variable - Shred it with a Foreach loop

Mapping Full Resultset with Execute SQL Task to Object Variable

要在SQLStatement属性中使用变量,请遵循this线程。

答案 1 :(得分:1)

Vikamsinh的回答在技术上是正确的,但是他给了你错误的解决方案。

简单地说:如果要插入SQL命令的字符串变量超过8000个字符,则无法执行您想要执行的操作。由于您必须使用NVARCHAR(MAX),因此SSIS只会将其解释为Object变量,并且您无法将其转换为String。

根据您的评论,您可能包含100,000个字符的字符串。 (这么多ID!)S

但是有一个非常简单的解决方案:使用脚本源组件而不是标准源组件。然后,您可以将对象变量的值转换为.NET String Type,在那里构建SQL语句,并根据您的连接执行它以读取结果。

此处the MSDN sample on using a Script Source Component


总而言之,您的原始资源是一大堆数据吗?你可以把它改成"从表中选择字段"使用Lookup过滤并使用您从执行SQL任务中提取的ID进行过滤?或者(甚至更好)你可以将你的ID推送到源数据库的临时表中,然后使用连接将源查询限制为你想要的行吗?