【问题标题】:Simple SSIS from Oracle to SQL Server drops rows从 Oracle 到 SQL Server 的简单 SSIS 删除行
【发布时间】:2021-03-22 17:36:07
【问题描述】:

我的 SSIS (VS 2017) 数据流中有一个非常简单的 SQL 查询。它通过 Native OLE DB\Oracle Provider for OLE DB 连接到 Oracle,并使用 SQL 命令查询 Oracle 视图。目标表是 SQL Server 2017 表。如果我只查询前 20 列左右(我正在查询 57 列),我会得到所有 1,060,000 条记录。当我开始添加更多列时,行数下降。我已经从两个表中删除了任何日期字段,并且已经完成了相当多的数据转换(源表有几个 varchar2(4000) 字段需要在 SQL 目标表中以合理的长度进行 SUBSTR。目标表中的所有字段都是可以为空。当我将 SQL 从 SSIS 中拉出并在 SQL Developer 中运行时,我得到了正确的行数。当我在 SSIS 中运行它时,它从 1.06 M 行下降到大约 28k。我已经尝试过 SQLChick hack (@987654321 @) 不起作用并导致连接错误(我必须使用 VS Code 将该属性添加到我的 Oracle 连接中,然后当我返回 VS 时,连接已断开。打开它以重新输入连接凭据时(从图片中可以看出,两项工作都“成功”完成y”。)

此代码返回所有记录:

SELECT 
    PIDM,
    STUDENT_ID,
    LAST_NAME,
    FIRST_NAME,
    MIDDLE_NAME,
    LFM_NAME,
    FML_NAME,
    SORT_NAME,
    GENDER,
    ETHNIC_CODE,
    ETHNIC_CODE_DESC,
    LEGACY_CODE,
    LEGACY_CODE_DESC,
    ADDR_STR_LINE1,
    ADDR_STR_LINE2,
    ADDR_STR_LINE3,
    ADDR_CITY,
    ADDR_COUNTY,
    ADDR_STATE,
    ADDR_NATION,
    ADDR_ZIPCODE,
    ADDR_AREA_CODE,
    ADDR_PHONE
FROM <TABLE_NAME>

此代码仅返回 28k:

SELECT 
    PIDM,
    STUDENT_ID,
    LAST_NAME,
    FIRST_NAME,
    MIDDLE_NAME,
    LFM_NAME,
    FML_NAME,
    SORT_NAME,
    GENDER,
    ETHNIC_CODE,
    ETHNIC_CODE_DESC,
    LEGACY_CODE,
    LEGACY_CODE_DESC,
    ADDR_STR_LINE1,
    ADDR_STR_LINE2,
    ADDR_STR_LINE3,
    ADDR_CITY,
    ADDR_COUNTY,
    ADDR_STATE,
    ADDR_NATION,
    ADDR_ZIPCODE,
    ADDR_AREA_CODE,
    ADDR_PHONE,
    ORIGIN_STR_LINE1,
    ORIGIN_STR_LINE2,
    ORIGIN_STR_LINE3,
    ORIGIN_CITY,
    ORIGIN_COUNTY,
    ORIGIN_NATION,
    ORIGIN_STATE,
    ORIGIN_ZIPCODE,
    EMAIL,
    HIGH_SCHOOL_CODE,
    HIGH_SCHOOL_CODE_DESC,
    HIGH_SCHOOL_CITY,
    HIGH_SCHOOL_STATE,
    HIGH_SCHOOL_GPA,
    HIGH_SCHOOL_RANK,
    PRIOR_COLLEGE_CODE,
    PRIOR_COLLEGE_CODE_DESC,
    PRIOR_COLLEGE_DEGREE_CODE,
    PRIOR_COLLEGE_DEGREE_CODE_DESC,
    PRIOR_COLLEGE_CITY,
    PRIOR_COLLEGE_STATE,
    ADMIT_FLAG,
    GENERAL_STUDENT_FLAG,
    CURRENT_ENROLLMENT_FLAG,
    LETTER_CODES,
    CONTACT_CODES,
    COMMENT_CODES,
    DIRECTORY_EMAIL,
    ADDR_DIVISION_CODE,
    HIGH_SCHOOL_CLASS_SIZE,
    ETHNICITY,
    RACE_CODE,
    REGULATORY_RACE,
    INT_LANG
FROM <TABLE_NAME>

来自 cmets 的故障排除步骤

如果您使用与 SSIS 包相同的凭据在 sql developer(无论 Oracle 查询工具是什么)中运行查询的所有列版本,您会得到 28k 行还是 1M?

  • 当我使用 SSIS 使用的相同凭据时,SQL Developer 中返回 1M 记录。 ——

尽管可能很痛苦,但我会添加 1 列,运行,观察结果。当您第一次看到行数下降时,请询问源数据的具体情况(数据类型、排序规则、是否有某些权限在起作用)。如果似乎没有什么不妥之处,请编辑问题以包含完整的表定义,并确定第一个源列是什么导致结果丢失。

  • 我已经做到了。逐列。我什至添加了一个已经存在的列(ADDR_STR_LINE1)作为 ORIGIN_STR_LINE1 并且只是给它起了别名,知道 ADDRR_STR_LINE1 已经工作并且两个字段共享确切的数据类型/长度等。我只是用这个代码运行它:SELECT PIDM, ORIGIN_STR_LINE1, ORIGIN_STR_LINE2, ORIGIN_STR_LINE3, ORIGIN_CITY, ORIGIN_COUNTY, ORIGIN_NATION, ORIGIN_STATE, ORIGIN_ZIPCODE FROM ODSMGR.RECRUIT_PERSON_OSU 和它返回 100 万条记录。

虽然有点安慰,但您完成了我会采用的所有故障排除步骤。我想我要排除的下一个项目是一些奇怪的行宽问题/错误。添加新的数据流。作为您的源查询,获取您的 varchar2(4000) 字段之一并将其复制 60 次,即 SELECT ADDR_STR_LINE1 AS Col0, ADDR_STR_LINE1 AS Col1, ..., ADDR_STR_LINE1 As Col59 FROM Owner.Table 并将其连接到派生列任务(它不需要做任何事情,只需充当锚点)并运行它。你得到 1M 还是 28k?

  • 添加更多我的故障排除步骤。 1)从原始表创建一个视图,将所有需要截断的字段转换为 VARCHAR(基于目标表的适当长度)。 2) 零碎地添加/减去字段,直到我认为我有一个稳定的查询,知道如果我添加 将被删除。但是,例如,我添加了 PRIOR_COLLEGE_CITY 并且第一次,我的计数从 1063202 下降到 952755,但后来,我再次运行它,计数从 1063202 下降到 953989,所以即使这是一个数据问题(不是) 这不是一个一致的。

  • 将 953989 行放入目标表后,我比较了哪些 PRIOR_COLLEGE_CITY 记录丢失。在源数据流中,我明确查询了这些记录,并且它们加载良好,所以再次强调,这不是数据问题。

【问题讨论】:

  • 如果您在 sql developer(无论 Oracle 查询工具是什么)中使用与 SSIS 包相同的凭据运行查询的全列版本,您会得到 28k 行还是 1M?
  • 当我使用与 SSIS 相同的凭据时,SQL Developer 中会返回 1M 记录。
  • 虽然很痛苦,但我会添加 1 列,运行,观察结果。当您第一次看到行数下降时,请询问源数据的具体情况(数据类型、排序规则、是否有某些权限在起作用)。如果似乎没有什么不妥之处,请编辑问题以包含完整的表定义,并确定第一个源列是什么导致结果丢失。
  • 我已经做到了。逐列。我什至添加了一个已经存在的列 (ADDR_STR_LINE1) 作为 ORIGIN_STR_LINE1 并且只是给它起了别名,知道 ADDRR_STR_LINE1 已经工作并且两个字段共享确切的数据类型/长度等。我只是用这个代码运行它:SELECT PIDM,ORIGIN_STR_LINE1, ORIGIN_STR_LINE2、ORIGIN_STR_LINE3、ORIGIN_CITY、ORIGIN_COUNTY、ORIGIN_NATION、ORIGIN_STATE、ORIGIN_ZIPCODE FROM ODSMGR.RECRUIT_PERSON_OSU,它返回了 100 万条记录。
  • 添加更多我的故障排除步骤。 1)从原始表创建一个视图,将所有需要截断的字段转换为 VARCHAR(基于目标表的适当长度)。 2) 零碎地添加/减去字段,直到我认为我有一个稳定的查询,知道如果我添加 将被删除。但是,例如,我添加了 PRIOR_COLLEGE_CITY 并且第一次,我的计数从 1063202 下降到 952755,但后来,我再次运行它,计数从 1063202 下降到 953989,所以即使这是一个数据问题(不是) 这不是一个一致的。

标签: sql-server oracle ssis oledb


【解决方案1】:

根据你提供的图片,Source组件在输出记录时,有部分记录丢失,可以判断是Source组件出现这个问题。 在这种情况下,请尝试在您的情况下检查以下内容。 1.在Source组件中执行查询时,在Oracle环境中运行查询(不是视图而是视图内部的查询),然后检查记录数(从Oracle环境返回)是否等于记录数(返回来自 SSIS 源组件)。在单独的数据任务上执行此操作。 2. 检查源表是否有一些变化。 3.如果在Oracle环境下运行查询返回结果正确,请尝试将正确结果与SSIS Source返回结果进行对比,分析缺失数据。

【讨论】:

  • “当我从 SSIS 中提取 SQL 并在 SQL Developer 中运行它时,我得到了正确的行数。”我正在查询 Oracle 中的一个表(我之前打错了),所以 1 和 2 已经被考虑在内。 3 在这种情况下没有意义 - 尝试比较我如何在没有任何 where 子句的情况下丢失 97% 的数据,如果我只是减少返回的列,我会获取所有记录 - 没有过滤器。
猜你喜欢
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多