使用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发出警告“验证警告。数据已经按照指定的顺序进行了排序,因此可以删除该转换”。
两个问题:
我过去曾遇到过这种情况,答案是否定的,在源SQL中使用ORDER BY排序并不总是与在Dataflow任务中使用排序转换产生相同的结果。某些特殊(非字母数字)字符(可能为NULLS)的处理方式有所不同。我不记得确切。我不记得找到任何有关此的文档(这是几年前的事),但是我通过自己的测试证实了这一点。
我的结论是,要在数据流中进行JOIN,请确保对JOIN的两面都使用相同的排序方法。
至于第二个问题,SSIS在数据源上具有IsSorted属性。如果将DataSource上的IsSorted属性设置为true,那么如果尝试执行“排序转换”,则它所知道的只是IsSorted为true,并且会发出不需要排序的警告。它不知道是否需要“排序转换”以匹配使用排序转换的另一个源。
如果要在JOIN的两侧使用“排序转换”,请将源的IsSorted属性设置为false。