【问题标题】:SQL Server Integration Services Merge Join not working for multiple rowsSQL Server 集成服务合并连接不适用于多行
【发布时间】:2013-09-15 14:11:44
【问题描述】:

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

更多信息:

两者都是预先排序的(在源查询中排序)。 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; Merge Join 使用 SQL Server UNIQUEID:1、EXTERNAL_ID:1 和 ORACLE_UNIQUE_ID:999 按预期返回一行。如果 SQL Server 源有三行 UNIQUEID: 1,2,3 而 Oracle 源有两行 EXTERNAL_ID:1,2 和 ORACLE_UNIQUE_ID:999,998;合并连接不返回任何数据。

【问题讨论】:

  • 您的 oracle 数据库的 加入密钥 不是 ORACLE_UNIQUE_ID
  • 是的,不是。 Oracle 的连接键是 external_id(排序顺序 1)。
  • 数据是否已预先排序?即在两个查询中都以 ORDER BY 形式排序? SSIS 数据类型是否匹配?
  • 两者都是预先排序的(在源查询中排序)。 oracle 源列 EXTERNLAL_ID 在查询中被强制转换为整数,即 CAST(EXTERNAL_ID AS INTEGER),因此在 Merge Join 之前,两个连接键都以 DT_I4 结束。
  • 两个问题:什么是数据转换变换,具体来说:对key列有影响吗?另外:围绕Oracle数据源和合并连接的容器是什么?

标签: sql-server ssis inner-join


【解决方案1】:

如果任一源的数据类型是 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2013-08-08
    • 2018-12-27
    • 1970-01-01
    • 2017-03-04
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多