分配给变量“User :: de_sters”的值的类型与当前变量类型不同

时间:2013-04-09 11:37:46

标签: sql-server ssis

我有一个变量de_sters,一个字符串类型变量,因为它在我的SSIS包中定义,它的范围是SSIS包,我需要fill,其值为几行表,使用Execute Sql Task包。

底线是我有一个“执行Sql任务”包,在礼仪中 - >“Sql Statement”我写道:

declare @s varchar(max) = '' 
select @s =  case when @s <> '' 
                  then  @s + ',''' + employer_name + '''' 
                  else   @s + '''' + employer_name+ ''''
                  end 
from employers
select @s as Result

然后,在Result Set我选择Single Row(首先我运行了我的选择,我看到它只返回一行)。然后在标签Result Set(左侧)上我在Result Name字段Result(我之前的sql语句中的别名)和在Variable Name字段中写了User::de_sters

但是当我运行sql任务时它会给我

The type of the value being assigned to variable "User::de_sters"
differs from the current variable type" error.

任何帮助或提示?

2 个答案:

答案 0 :(得分:7)

问题是SSIS无法将varchar(max)理解为数据类型。您需要指定limit。将max值更改为8000

declare @s varchar(8000) = '' 

如果您的字符串非常大,那么在查询中使用带有varchar(max)的FullResultSet,并将值存储在数据类型为object的变量中。

现在为了访问对象,请使用Script taskScript component(数据流)并编写以下代码以从object变量中提取值

OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataTable dt = new DataTable();
oleDA.Fill(dt, Dts.Variables["User::YourVariable"].Value);
 foreach (DataRow rowLoop in dt.Rows)
     {
        MessageBox.Show (rowLoop[0].ToString());
     }

答案 1 :(得分:1)

要将UIView varchar(max)内的SQL Script Tasks字段加载到字符串变量中,您应该将其拆分为较小的块,例如。 Control flow并将其加载到varchar(4000),然后在下一步中添加object以将它们合并回foreach loop container变量,

将大文本拆分为较小的文本作为行,您可以使用以下存储过程:

string

然后在foreach容器包含的表达式任务中添加以下表达式,并将它们连接回一个字符串,

CREATE PROCEDURE SSIS_VarcharMax_Loader 
     @Input varchar(max) ,
     @maxRowLength int = 50
 AS
 BEGIN
 SET NOCOUNT ON


 ;WITH 
     tmp(inp,c,rn) as (
              select @Input,SUBSTRING(@Input, 1,@maxRowLength),@maxRowLength
           union all
              select @Input,SUBSTRING(@Input,rn,@maxRowLength),rn + @maxRowLength
              from tmp
              where rn < len(@Input)
        )
      select c from tmp
      OPTION (MAXRECURSION 500);

 END;

asd asd asd asd asd