开篇介绍

上午在天善回答看到这个问题 - SSIS 导出数据文件,能否在第一列增加一个行号,很快就帮助解决了,方法就是在 SQL 查询的时候加一个 ROW_NUMBER() 就可以了。

后来想起在两年前我的第一个 BI 项目上也有类似的文件输出需求,但是比这个要复杂的多,因为涉及到多个输入列的逻辑判断和计算问题,比如还有一些 XML 格式的数据。这些逻辑不能直接在 SQL 查询时直接实现,比如还要做 XML 格式验证,字符串匹配查找,还有其它的比较复杂的逻辑。所以就选择了另外一种方式 - 在数据源输入和文件输出组件之间加了一个 Script Component 组件,利用它程序化处理添加了必要的输出列供下游使用,当然逻辑比较复杂在 Script Component 中写了不少代码还有异常记录输出等。

虽然没有必要使用 Script Component 来解决这个问题,但是还是可以通过这个小例子简单介绍一下 Script Component,多了解一种方法,在项目需要的时候就多一种选择。

使用 Script Component 为数据流输出添加行号

数据源可以随便选用一张表来进行测试输出。

数据源向下的输出列 -

拖放一个排序控件,如果希望输出的格式按某列排序的话,可以选择一个列来排序,这里使用 FullName 进行排序。

拖放一个 Script Component,这里要选择 Transfomation 转换,意味着在输入源和输出目的地之间进行中间转换的组件。

如果以后在 Script 中有比较复杂的逻辑运算需要使用到输入源的某些列的话,可以在这里选中它。

最重要的就是这里的输出列了,这个输出列之前并不存在,是通过 Script Component 创建出来的,后面可以使用到的。

选择 Script 项并点击 Edit Script 打开之后就能看到这些代码,这里面有几个方法。

  • PreExecute() - 只会被调用一次,在数据流执行到这个控件的时候调用,并且是在所有行处理前调用,可以在这里做一些初始化计算。
  • PostExecute() - 当所有行全部处理完之后调用,可以在这里和 PreExecute() 配合起来记录处理的时间,时长等等。
/// <summary>
/// This method is called once, before rows begin to be processed in the data flow.
///
/// You can remove this method if you don't need to do anything here.
/// </summary>
public override void PreExecute()
{
base.PreExecute();
/*
* Add your code here
*/
} /// <summary>
/// This method is called after all the rows have passed through this component.
///
/// You can delete this method if you don't need to do anything here.
/// </summary>
public override void PostExecute()
{
base.PostExecute();
/*
* Add your code here
*/
} /// <summary>
/// This method is called once for every row that passes through the component from Input0.
///
/// Example of reading a value from a column in the the row:
/// string zipCode = Row.ZipCode
///
/// Example of writing a value to a column in the row:
/// Row.ZipCode = zipCode
/// </summary>
/// <param name="Row">The row that is currently passing through the component</param>
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
/*
* Add your code here
*/
}

最后的一个方法是我们要使用到的,就是转换处理。在方法外面定义一个变量,表示行号从 1 开始。方法参数 Row 已经将之前在 Script Component 中引用的 InputColumn 和 创建的 OutputColumn 全部包装成了属性,直接可以通过 Input0Buffer Row 来调用。 那么每进来一行数据,这个方法就被调用一次并同时向下输出一次。也就是说进来一行,处理一行,出去一行。

    int rowNumber = ;
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.RowNumber = rowNumber;
rowNumber = rowNumber + ;
}

保存并执行包,开启一个 Data Viewer 查看一下运行时的数据,就能看到 RowNumber 已经创建好了,下游就可以向文件写入数据了。

使用 ROW_NUMBER()来实现添加数据流的行号

当然对于这个例子,直接使用 ROW_NUMBER() 最简单了,维护成本很低。

一步就搞定了同样的效果。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

微软BI 之SSIS 系列 - 通过 ROW_NUMBER 或 Script Component 为数据流输出添加行号的方法的更多相关文章

  1. 微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法

    开篇介绍 在 SSIS 中并没有直接提供从数据源到 XML 的转换输出,Destination 的输出对象有 Excel File, Flat File, Database 等,但是并没有直接提供 X ...

  2. 微软BI 之SSIS 系列 - 再谈Lookup 缓存

    开篇介绍 关于 Lookup 的缓存其实在之前的一篇文章中已经提到了 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache ...

  3. 微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据

    开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使 ...

  4. 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据

    开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...

  5. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug

    开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...

  6. 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

    原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...

  7. 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式

    开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...

  8. 微软BI 之SSIS 系列 - Lookup 中的字符串比较大小写处理 Case Sensitive or Insensitive

    开篇介绍 前几天碰到这样的一个问题,在 Lookup 中如何设置大小写不敏感比较,即如何在 Lookup 中的字符串比较时不区分大小写? 实际上就这个问题已经有很多人提给微软了,但是得到的结果就是 C ...

  9. 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧

    案例背景与需求介绍 之前做过一个美国的医疗保险的项目,保险提供商有大量的文件需要发送给比如像银行,医疗协会,第三方服务商等.比如像与银行交互的 ACH 文件,传送给协会的 ACH Credit 等文件 ...

随机推荐

  1. BZOJ1076 [SCOI2008]奖励关 概率 状态压缩动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1076 题意概括 有n个东西,k次扔出来.每次等概率扔出其中一个. 你可以拿这个东西,但是有条件,得 ...

  2. bochs配置文件解释说明

    ############################################### # Configuration file for Bochs ##################### ...

  3. Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分

    PO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数 ...

  4. js数据结构之二叉树的详细实现方法

    数据结构中,二叉树的使用频率非常高,这得益于二叉树优秀的性能. 二叉树是非线性的数据结构,用以存储带有层级的数据,其用于查找的删除的性能非常高. 二叉树 数据结构的实现方法如下: function N ...

  5. [洛谷P1731][NOI1999]生日蛋糕(dfs)(剪枝)

    典型的深搜+剪枝策略 我们采用可行性剪枝.上下界剪枝.优化搜索顺序剪枝.最优性剪枝的方面来帮助我们进行剪枝. 也许有人还不知道剪枝,那我就弱弱地为大家补习一下吧qwq: .优化搜索顺序: 在一些搜索问 ...

  6. Spring MVC 注解 @RequestParam解析

    在Spring MVC 后台控制层获取参数的方式主要有两种,一种是requset.getParameter(“name”),另一种是用注解@Resquest.Param直接获取. 一.基本使用获取提交 ...

  7. 软工实践第五次作业-WordCount进阶需求

    软工实践作业(五) GitHub 作业链接 结对博客 031602240 具体分工 PSP表格 代码规范 解题思路与设计说明 爬虫使用 代码组织与内部实现设计(类图) 算法关键 实现方法 流程图 附加 ...

  8. Linux服务器下Nginx与Apache共存

    解决思路: 将nginx作为代理服务器和web服务器使用,nginx监听80端口,Apache监听除80以外的端口,我这暂时使用8080端口. nginx.conf 位置:/etc/nginx/ngi ...

  9. pycharm引入numpy报错:ImportError: Importing the multiarray numpy extension module failed. Most likely you are trying to import a failed build of numpy.

    软件为pycharm,安装了anaconda. 我一开始的报错为,PyCharm中无法调用numpy,报错ModuleNotFoundError: No module named 'numpy',这个 ...

  10. NullPointerExceptio异常出现的情况

    NullPointerException是java.lang.NullPointerException的简称,是Java语言中的一个异常类,位于java.lang包中,父类是java.lang.Run ...