6

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

底线是我有一个“执行 Sql 任务”包,在属性 - >“Sql 语句”中我写过:

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 task 它给了我

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

任何帮助或提示?

4

2 回答 2

8

问题是 SSIS 不理解varchar(max)为数据类型。您需要指定limit.Just 将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());
     }
于 2013-04-09T12:35:51.967 回答
1

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

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

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;

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

@strResult = (ISNULL(@[User::strResult])?"": @[User::strResult] )+  @[User::str]

asd asd asd asd asd

于 2016-05-02T04:50:38.870 回答