一尘不染

Order By的排序方式与SSIS(集成服务)中的Sort Transformation方式不同

sql

使用SSIS时,由于使用两个OLE DB源进行排序,因此在加入时遇到了问题。

我发现,如果我使用按顺序排序和排序转换,则会产生不同的结果,从而导致合并联接到产品不正确的数据

例子:

表格1

Id int PK
JoinKey varchar(25)
OriginalValue varchar(25)

表2

Id int PK
JoinKey varchar(25)
ExpectedValue varchar(25)

SSIS中的程序流程如下:

  1. 从表1中选择OLE数据源
  2. 按JoinKey升序然后按ExpectedValue升序对Table1进行排序转换
  3. OLE数据源从Table2中选择按JoinKey asc排序
  4. 在JoinKey上将Table1和Table2合并联接转换(左外部联接),并选择OriginalValue和ExpectedValue

这样做-对于某些数据集,我最终得到了ExpectedValue的空值。直接在SQL中执行查询将返回预期的值。

如果我在步骤5之前添加了排序转换,则它正确地加入了ExpectedValue,但是SSIS发出警告“验证警告。数据已经按照指定的顺序进行了排序,因此可以删除该转换”。

两个问题:

  1. 不应该使用order by和sort转换来产生相同的结果吗?
  2. 为什么在实际需要排序时SSIS会显示警告?

阅读 155

收藏
2021-05-30

共1个答案

一尘不染

我过去曾遇到过这种情况,答案是否定的,在源SQL中使用ORDER
BY排序并不总是与在Dataflow任务中使用排序转换产生相同的结果。某些特殊(非字母数字)字符(可能为NULLS)的处理方式有所不同。我不记得确切。我不记得找到任何有关此的文档(这是几年前的事),但是我通过自己的测试证实了这一点。

我的结论是,要在数据流中进行JOIN,请确保对JOIN的两面都使用相同的排序方法。

至于第二个问题,SSIS在数据源上具有IsSorted属性。如果将DataSource上的IsSorted属性设置为true,那么如果尝试执行“排序转换”,则它所知道的只是IsSorted为true,并且会发出不需要排序的警告。它不知道是否需要“排序转换”以匹配使用排序转换的另一个源。

如果要在JOIN的两侧使用“排序转换”,请将源的IsSorted属性设置为false。

2021-05-30