【问题标题】:SSIS Merge Join component wrote 0 rowsSSIS Merge Join 组件写了 0 行
【发布时间】:2023-03-27 13:51:01
【问题描述】:

首先,感谢社区提供网站上的大量信息,在 C# 和 SSIS 方面帮助了我很多。第二件事是我的英文不是很好,所以请耐心等待,如果您有不明白的地方,请提出,我会努力使它变得更好。

我从不同的数据库中获得了 2 个 OLEDB 连接源,两个表都有一个带有我用作连接键的 ID 的列。在 RUT CRUZADOS 中,ID 是浮点数据类型,而在其他源(CTACTE AÑO PAS)中,我不知道它是哪种类型的数据(我无法使用 sql server 打开数据库,我只能执行 SELECT 操作)。

当我在 Merge 中合并它们时,它不会返回任何错误,但是当我运行程序时,会发生这种情况。

[SSIS.Pipeline] 信息:“组件“CARGOS ABONOS”(239)”写入 0 行。

在 Microsoft Access 中,“内部联接”返回的行数约为 4 百万行。我认为问题在于元数据,但我不知道如何使用“数据转换”。谁能帮帮我。

谢谢大家

【问题讨论】:

    标签: join ssis merge metadata


    【解决方案1】:

    您可以通过双击连接线来查看数据类型,至少就 SSIS 而言。在弹出的数据流路径编辑器中,元数据选项卡将描述列类型。

    也就是说,这并不重要,因为 Merge Join 转换只允许您合并相同类型的数据。

    Merge Join 要求对源系统数据进行排序。这可以通过将排序组件添加到流中来完成(不推荐,因为这是一种异步转换,会占用所有内存并降低性能),或者通过在源系统中显式排序,然后在“高级”选项卡中将它们标记为已排序。

    由于我没有看到排序,这让我相信排序是在源系统中完成的。或者,没有在那里进行排序,但有人将输出标记为已排序。在这些源查询中必须有明确的ORDER BY 子句。有时,SQL Server 会以相同的顺序返回数据,但除非有 ORDER BY,否则它无法得到保证。 (我希望我可以使用 flash 标签来强调最后一点)。

    未来的读者,如果您在两个系统中都有排序并且它们都在同一列上排序,那么您需要检查排序规则。不区分大小写是一种不同于区分大小写的野兽,基于 ASCII 的系统上的排序产生的排序与使用 EBCIDIC 处理混合字母数字的排序不同,就像我曾经有过的那样......

    由于源数据类型似乎是浮点数,因此排序可能不是罪魁祸首。我开始意识到,你可能有一个更丑陋和更阴险的比较问题,而不是排序问题。浮点数是近似值。 1=1 但 1.00000000000(etc) 可能等于也可能不等于 1.0000000000(etc)1

    你真的需要小数位来匹配吗?如果不是,则在两个系统中都转换为整数(并按 CAST 值排序)应该使这些匹配起作用。如果有重要的小数位,那么您将需要将其转换为精确的数字类型(并祈祷它们都以相同的方式转换)。 Access 确实做到了这一事实让我相信整数数据类型将是你的救星。

    【讨论】:

    • 非常感谢 billinkc,CAST 的想法和排序工作完美......这个问题浪费了 2 个工作日,你在几分钟内就解决了,我真的很感谢你的帮助。
    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多