开篇介绍

这个问题来自于 天善BI社区,看了一下比较有意思,因为我自己认为在 SSIS中处理各种类型文件的经验还比较丰富(有一年的时间几乎所有ETL都跟文件相关),但是这个问题确实之前没有特别考虑过。研究了一下,找到了解决的方法,赶紧记录下来。

简单描述一下这个问题,如果我们的 SOURCE 是直接从表里面查询,然后输出到文件的时候,查询语句中列的顺序就是输出文件列的顺序(逗号分隔的文件)。但是如果使用变量查询语句,那么这个输出顺序和查询列的顺序就会不一致了!如果我们的文件格式已经提前定义好了,那么这个就很不好调整了。除非手动一列一列的在文件管理器中删除所有列,然后重新建立,但这样会非常耗费时间和精力,并且非常容易出错。

解决过程

先看看问题,再来看比较简单的解决方案。

测试数据源查询语句和结果 -

如果是直接查询的话,文件输出列的顺序没有任何问题和影响,下面是我的查询语句,和在 SQL Server 中的是一样的。

OLE DB Source 里的顺序与查询语句一致。

向下关联一个文件输出并在它的连接管理器中可以看到这些顺序都是一样的,不需要做出任何调整。

最后的输出结果也是一样的,列的输出顺序都一致,没有问题。

现在我们使用变量来保存这个查询语句 -

在数据源中使用这个变量作为查询语句来查询 -

切换到 Columns 的时候发现非常诡异的地方出来了,整个列的输出顺序和查询的顺序不一样了。并且更为诡异的问题是,同样的两个变量语句,我反复删除试建了好几次。第一个的顺序和这个还不一样,第二个正常,这是第三个顺序。并且在最开始只测试几个字段的时候,这个顺序一直是正常的,现在看到的是我增加了好几个列才看到的。关于为什么有这个变化,或者与写没写 Top 10 我还真的没有办法重现刚才的第一个顺序,总之问题出现了。

这样输出的时候,和文件管理器关联之后的顺序。以前的做法是先删除所有的,然后重新一项一项添加回去,并且还要注意数据类型都要记下来。

但是这样确实存在一个问题,如果我们的输出列比较复杂,要不一个一个列的类型顺序记载下来会非常花费时间和精力。可以在这里调整,但是总觉得是一个效率比较低的选择。

输出的结果果然如此,顺序和期望的不一致!

解决的方法虽然也需要人工手动操作,但是比起在文件管理器中删除新建要容易的多,回到数据源的列,先取消全部可用的列。

然后对照查询语句列的顺序,依次选中需要的列,比如第一个先勾选 BusinessEntityID,第二个再勾选 NationalIDNumber,后面根据需要按顺序依次勾选。

按顺序选择完成之后,这样所有的列又按照查询顺序输出了。

需要重新建立新的文件链接管理器,这样可以避免之前的缓存影响,再来看管理器中的列顺序也是对应一致的,没有问题了。

输出结果也是一致的了!

写到这里我也仍然怀疑,如果直接用表难道就一直没有出现这个现象吗,还是没有碰到? 这个确实记不清了,但是从这个问题反而使得另外的一个问题变得很清晰,也就是无论输入源的查询顺序是怎么样的,我们完全可以控制它的输出顺序。因为有的时候可能会碰到第三方直接给你一个视图或者存储过程,输出的就是这样的顺序,但是下游文件格式已经固定了,那么就可以通过这种方式来完成自定义的顺序向下输出了。

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

微软BI 之SSIS 系列 - 变量查询语句引起列输出顺序不一致的解决方法的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧

    开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...

随机推荐

  1. 约数 求反素数bzoj1053 bzoj1257

    //约数 /* 求n的正约数集合:试除法 复杂度:O(sqrt(n)) 原理:扫描[1,sqrt(N)],尝试d能否整除n,若能,则N/d也能 */ ],m=; ;i*i<=n;i++){ ){ ...

  2. Python decorator

    1.编写无参数的decorator Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数. 使用 decorator 用Python提供的 @ 语法 ...

  3. 字节、字、bit、byte的关系【转】

    字 word 字节 byte 位 bit 字长是指字的长度 1字=2字节(1 word = 2 byte) 1字节=8位(1 byte = 8bit)  一个字的字长为16 一个字节的字长是8 bps ...

  4. BZOJ2287【POJ Challenge】消失之物

    题解: 1.以前见过类似的,可以cdq分治 当l=r时就是还有一个剩余 这样时间是nmlogn的 空间是mlogn 2.首先我们可以dp出表示出j的方案数 令g[i][j]表示不能选i,表示出j的方案 ...

  5. BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...

  6. Map的知识点梳理(不包含collections工具类)

    一:基础公共方法(map不再是简单的加索引,可以直接命名key,通过key进行遍历) 1.常见的map子类 HashTable:底层是哈希表结构.不允许null键和null值,线程同步 HashMap ...

  7. Linux 之 Makefile 报错

    1. 在make命令后出现这种错误提示,是提示第4行没有分隔符. 例如: 1 target:prerequisites ...... 4 command …… 改为: 1 target:prerequ ...

  8. 浅谈html5 video 移动端填坑记

    这篇文章主要介绍了浅谈html5 video 移动端填坑记,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 本文介绍了html5 video 移动端填坑记,分享给大家,具体 ...

  9. NIO 中的读和写

    概述 读和写是I/O的基本过程.从一个通道中读取很简单:只需创建一个缓冲区,然后让通道将数据读到这个缓冲区中.写入也相当简单:创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入操作. 从文件 ...

  10. BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)

    题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...