我有一个变量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.
任何帮助或提示?
答案 0 :(得分:7)
问题是SSIS无法将varchar(max)
理解为数据类型。您需要指定limit
。将max
值更改为8000
。
declare @s varchar(8000) = ''
如果您的字符串非常大,那么在查询中使用带有varchar(max)
的FullResultSet,并将值存储在数据类型为object
的变量中。
现在为了访问对象,请使用Script task
或Script 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;