2012-02-27 47 views
1

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

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

有没有办法将原始文件写出脚本步骤,以便通过进入数据流组件?

任何想法赞赏!

回答

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属性或你的脚本将炸毁处理空值。这是繁琐的工作而不是正常的来源,但与转储到磁盘或其他分段机制相比,您将更有效率,更快速并消耗更少的资源。

+0

这正是我所期待的。非常感谢您的详细解释! – DZx 2012-02-27 15:43:35

+0

如果你觉得这个和其他答案很有用,你可以点击问题旁边的向上箭头。如果这解决了您的问题,您也可以单击复选标记以表示问题已得到解答。 – billinkc 2012-02-27 16:05:54

0

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

+0

感谢您的帖子,cschneid。我将使用脚本组件作为源代码,因为我认为这是我最简单的路线。 – DZx 2012-02-27 15:45:31

1

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

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

您可以参考的脚本任务(它位于控制流画布上),而不是一个脚本组件(也就是数据流的一部分)添加。

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

脚本输入数据流任务。数据流的第一个组件是一个脚本组件,按照上面的billinkc描述的那样创建为源。该脚本将对象变量转换回列表。然后将列表中的每个项目分析到输出缓冲区中的字段。 各种拆分和变换任务从那里接管。