ssis超过4000个字符

时间:2014-01-20 18:53:10

标签: ssis

我的来源 - Oracle; 目标 - SQL Server

要求 - 我必须从目标服务器获取empid并将相同的empid传递给oracle并获取数据

方法,使用...我正在构建一个字符串(逗号分隔)包含empid的-1,2,3,... 10000。字符串10000的长度(将来可能会增加)。如何将此字符串传递给oracle和变量中的数据流任务。这意味着,在DFT中,我从这样的变量中选择这个字符串......“select * from emp where empid in” + @ [user :: empid] +“

CHallenge - 我看到表达式限制为4000.如何再次向数据流任务4000发送4000次。我无法使用合并,查找或forloop,因为它会达到性能。我也在这里发布了......

for more description about this issue

1 个答案:

答案 0 :(得分:8)

在2012版SQL Server Integration Services中删除的4k limit仅适用于表达式。

因此,如果您必须通过将所有这些用户ID连接在一起来构建源查询,那么您必须沿着当前行进的路线走下去,停止使用Expression并在脚本任务中执行字符串连接。

代码近似

Dts.Variables[SourceQuery].Value = string.Format("select * from dept where dept in ({0}), Dts.Variables[EmpList].Value.ToString());

POC

我创建了一个简单的包。连接到数据流的脚本任务,其变量定义为QuerySource,并使用以下逻辑构建一个长字符串,然后对表进行查询。

            // 551 characters
            string baseQuery = @"
SELECT
    AC.object_id
,   AC.name
,   AC.column_id
,   AC.system_type_id
,   AC.user_type_id
,   AC.max_length
,   AC.precision
,   AC.scale
,   AC.collation_name
,   AC.is_nullable
,   AC.is_ansi_padded
,   AC.is_rowguidcol
,   AC.is_identity
,   AC.is_computed
,   AC.is_filestream
,   AC.is_replicated
,   AC.is_non_sql_subscribed
,   AC.is_merge_published
,   AC.is_dts_replicated
,   AC.is_xml_document
,   AC.xml_collection_id
,   AC.default_object_id
,   AC.rule_object_id
,   AC.is_sparse
,   AC.is_column_set
FROM
    sys.all_columns AS AC
WHERE
    AC.object_id IN (0{0});";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = 0; i < 1000; i++)
            {
                sb.Append(',');
                sb.Append(i);
            }
            string queryFinal = string.Format(baseQuery, sb.ToString());
            MessageBox.Show(queryFinal.Length.ToString());
            Dts.Variables["QuerySource"].Value = queryFinal;

执行时,这是一个屏幕截图,显示变量/查询中超过4k个字符。

enter image description here

在我的数据流中,我使用“来自变量的SQL命令”,因为我们正在使用变量,这是唯一有意义的事情......

enter image description here