使用SSIS由于使用两个OLE DB源进行排序,我在加入时遇到了问题。
我发现,如果我使用订单与排序转换,则会产生不同的结果,从而导致合并连接产生不正确的数据
示例:
表1
Id int PK
JoinKey varchar(25)
OriginalValue varchar(25)
表2
Id int PK
JoinKey varchar(25)
ExpectedValue varchar(25)
SSIS中的计划流程如下:
在执行此操作时 - 对于某些数据集,我最终得到ExpectedValue的空值。直接在SQL中执行查询将返回预期的值。
如果我在步骤5之前添加排序转换,它会正确加入ExpectedValue,然后SSIS会出现警告"验证警告。数据已按指定方式排序,因此可以删除转换。"
两个问题:
我浏览了一些相关的帖子,但他们似乎关注效率而不是功能上的差异。
答案 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排序规则不同的排序顺序,这可能导致合并或合并连接转换产生意外结果。