【发布时间】: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