排序顺序与SSIS中的排序转换(集成服务)不同

时间:2015-03-20 14:28:05

标签: sql sorting ssis

使用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. 从Table1
  2. 中选择的OLE数据源
  3. 通过JoinKey asc然后ExpectedValue asc
  4. 对Table1进行转换
  5. OLE数据源从Table2 Order By JoinKey asc
  6. 中选择
  7. 在JoinKey上选择连接转换(左外连接)与Table1和Table2选择OriginalValue和ExpectedValue
  8. 在执行此操作时 - 对于某些数据集,我最终得到ExpectedValue的空值。直接在SQL中执行查询将返回预期的值。

    如果我在步骤5之前添加排序转换,它会正确加入ExpectedValue,然后SSIS会出现警告"验证警告。数据已按指定方式排序,因此可以删除转换。"

    两个问题:

    1. 不应该使用order by和sort转换会产生相同的结果吗?
    2. 为什么SSIS会在实​​际需要排序时发出警告?
    3. 我浏览了一些相关的帖子,但他们似乎关注效率而不是功能上的差异。

      1. Is it better to sort data at the application layer, or with an order by clause?
      2. why we need to use sort transformation before merge join transformation in ssis
      3. SQL Server Integration Service Left Join

2 个答案:

答案 0 :(得分:1)

我过去经历过这种情况,答案是否定的,在源SQL中使用ORDER BY进行排序并不总是产生与在Dataflow任务中使用排序转换相同的结果。某些特殊(非字母数字)字符(也许是NULLS)的处理方式有所不同;我无法记住究竟是哪一个。我不记得找到任何关于此的文件(这是几年前),但我通过自己的测试证实了这一点。

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

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

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

答案 1 :(得分:0)

找到一个微软帖子,说明原因。标记选项卡Alleman的回答作为答案,因为它是我找到这个的原因。

排序转换使用Windows排序规则对字符串值进行排序。

您不能单独使用ORDER BY子句,因为ORDER BY子句使用SQL Server排序规则对字符串值进行排序。使用SQL Server排序规则可能会导致与Windows排序规则不同的排序顺序,这可能导致合并或合并连接转换产生意外结果。

https://msdn.microsoft.com/en-us/library/ms137653.aspx