1

我正在使用 SSIS 来合并 join sql server 数据(左)和 oracle 数据(右)。两个数据集都在合并连接之前在源处排序。当 oracle 源仅返回一行时它工作正常,但当它返回多行时则不行。即使有几行具有匹配的数据,它也不会在 Merge Join 之后返回数据。这是我的流程:

SSIS 数据流

SSIS 合并加入任务

更多信息:

两者都是预先排序的(在源查询中排序)。oracle 源列在查询中EXTERNLAL_ID被转换为整数CAST(EXTERNAL_ID AS INTEGER),因此在 Merge Join 之前,两个连接键都以 DT_I4 结束。

示例:SQL Server 源代码有三行UNIQUEID:1、2、3,Oracle 源代码有一行EXTERNAL_ID:1、Oracle_UNIQUE_ID:999;UNIQUEIDMerge Join 使用 SQL Server :1、EXTERNAL_ID:1 和ORACLE_UNIQUE_ID:999按预期返回一行。如果 SQL Server 源有三行UNIQUEID:1,2,3,Oracle 源有两行EXTERNAL_ID:1,2 和ORACLE_UNIQUE_ID:999,998;合并联接不返回任何数据。

4

1 回答 1

2

如果任一源的数据类型是 VARCHAR() 而不是 INT,则排序可能不会按预期进行。考虑以下:

DECLARE @SampleTable TABLE (IntegerID INT, CharacterID VARCHAR(3))

INSERT INTO @SampleTable (IntegerID, CharacterID)

SELECT 1,1 UNION 
SELECT 2,2 UNION 
SELECT 12,12 UNION 
SELECT 122,122 UNION 
SELECT 3,3 UNION 
SELECT 133,133 UNION 
SELECT 31,31 UNION 
SELECT 321,321 


SELECT * FROM @SampleTable ORDER BY IntegerID

SELECT * FROM @SampleTable ORDER BY CharacterID

第一个 SELECT 按已知整数排序,按以下顺序返回数据:

1
2
3
12
31
...

第二个 SELECT 按字符字段(恰好包含一个数字)排序,按以下顺序返回数据:

1
12
122
133
2
3
...

您的 SSIS 任务(仅在 SELECT 中看到 CAST() 语句)假定当您对数据进行排序时,您将其排序为整数。您的 SQL 语句按字符版本对其进行排序,而不关心您在 SELECT 语句中返回了一个整数这一事实。

假设我是正确的,要解决此问题,您需要将源系统上的数据排序为整数,即ORDER BY CAST(EXTERNAL_ID AS INTEGER).

于 2014-09-02T16:42:25.220 回答