SSIS:如何阅读WebSphere MQ,转换和写入平面文件?

时间:2012-02-27 03:50:10

标签: ssis ibm-mq

我有关于WebSphere MQ队列的数据。我编写了一个脚本任务来读取数据,我可以将它输出到变量或文本文件。但我想将其用作数据流步骤的输入并转换数据。最终目的地是一个平面文件。

有没有办法将变量作为源读入数据流步骤?我可以将MQ数据写入文本文件,并读取数据流中的文本文件,但这似乎是很多开销。或者我可以跳过数据流altogther,并在脚本中写入所有转换(但是为什么首先要为SSIS烦恼?)

有没有办法从脚本步骤中编写原始文件,以传入数据流组件?

任何想法都赞赏!

3 个答案:

答案 0 :(得分:2)

如果您拥有使用Web服务的脚本,则可以跳过所有中间输出,只需将其用作数据流中的源。

将数据流任务拖到画布上并添加脚本组件。不要选择转换(最后一个选项),而是选择Source

双击脚本组件并选择Input and Output Properties。在“输出0”下,选择“输出列”,然后单击Add Column,以查找Web服务所包含的列数。适当地命名它们并确保正确定义它们的元数据。

定义列后,单击“脚本”选项卡,选择语言并编辑脚本。获取所有可能编写的代码消耗服务,我们将在此处使用它。

CreateNewOutputRows方法中,您需要遍历Websphere MQ请求的结果。对于返回的每一行,您将应用以下模式。

public override void CreateNewOutputRows()
{
    // TODO: Add code here or in the PreExecute to fill the iterable object, mqcollection

    foreach (var row in mqcollection)
    {
        // Adds a new row into the downstream buffer
        Output0Buffer.AddRow();

        // Assign all the data to the correct locations
        Output0Buffer.Column = row.Column;
        Output0Buffer.Column1 = row.Column1;

        // handle nulls appropriately
        if (string.IsNullOrEmpty(row.Column2))
        {
            Output0Buffer.Column2_IsNull = true;
        }
        else
        {
            Output0Buffer.Column2 = row.Column2;
        }
    }
}

必须通过_IsNull属性处理空值,否则您的脚本会爆炸。与普通的源相比,这是一项繁琐的工作,但与转储到磁盘或其他一些分段机制相比,您将更有效,更快,消耗更少的资源。

答案 1 :(得分:1)

由于我遇到了一些额外的“陷阱”,我以为我会发布我的最终解决方案。

我使用的脚本不调用webservice,而是直接连接并读取WebSphere队列。但是,为了做到这一点,我必须添加对amqmdnet.dll的引用。

您可以添加对脚本任务(位于控制流画布上)的引用,但不能添加脚本组件(这是数据流的一部分) )。

所以我有一个脚本任务,带有引用和代码来读取队列的内容。队列中的每一行只是一个固定宽度的记录,每一行都被添加到一个List中。最后,将List放入在包级别声明的读/写对象变量中。

脚本提供给数据流任务。数据流的第一个组件是一个脚本组件,创建为Source,正如billinkc在上面描述的那样。此脚本将对象变量强制转换为列表。然后将列表中的每个项解析为输出缓冲区中的字段。 各种拆分和转换任务从那里接管。

答案 2 :(得分:0)

尝试使用MA01 MQ supportpac中提供的Q程序,而不是您的脚本。