我在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.
”。
任何人都知道这是什么问题?
感谢
答案 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推送到源数据库的临时表中,然后使用连接将源查询限制为你想要的行吗?