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

SSIS:如何读取WebSphere MQ、转换和写入平面文件?,ssis,ibm-mq,Ssis,Ibm Mq,我在WebSphere MQ队列上有数据。我已经编写了一个脚本任务来读取数据,并且可以将其输出到变量或文本文件中。但我想将其作为数据流步骤的输入,并转换数据。最终目的地是平面文件 是否有办法将变量作为源读取到数据流步骤中?我可以将MQ数据写入文本文件,并在数据流中读取文本文件,但这似乎需要很大的开销。或者我可以跳过dataflow altogther,在一个脚本中编写所有的转换(但是为什么要首先使用SSI呢?) 有没有一种方法可以将原始文件从脚本步骤写入数据流组件 任何想法都值得赞赏 尝试使用M

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

是否有办法将变量作为源读取到数据流步骤中?我可以将MQ数据写入文本文件,并在数据流中读取文本文件,但这似乎需要很大的开销。或者我可以跳过dataflow altogther,在一个脚本中编写所有的转换(但是为什么要首先使用SSI呢?)

有没有一种方法可以将原始文件从脚本步骤写入数据流组件


任何想法都值得赞赏

尝试使用MQ中可用的Q程序而不是脚本。

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

将数据流任务拖到画布上,然后单击“添加脚本”组件。选择
Source
,而不是选择Transformation(最后一个选项)

双击脚本组件并选择
输入和输出属性
。在“输出0”下,选择“输出列”,然后单击“添加列”,查看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属性处理空值,否则脚本将崩溃。与普通源代码相比,这是一项乏味的工作,但与转储到磁盘或其他登台机制相比,您的效率更高、速度更快、消耗的资源更少。

因为我遇到了一些额外的“问题”,我想我应该发布我的最终解决方案

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

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

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

该脚本将馈送到数据流任务中。数据流的第一个组件是脚本组件,创建为源代码,如上面billinkc所述。此脚本将对象变量强制转换回列表。然后将列表中的每个项目解析为输出缓冲区中的字段。
各种拆分和转换任务从那里接手。

这正是我想要的。非常感谢您的详细解释!如果您发现此答案和其他任何答案非常有用,可以单击问题旁边的向上箭头。如果这解决了您的问题,您也可以单击复选标记以表示问题已被回答。谢谢您的帖子,cschneid。我将使用脚本组件作为源代码,因为我认为这是最简单的方法。