在 SQL Server 中将值分配给类似列后,使用 SSIS 将 Oracle 表列更新为 Null
Posted
技术标签:
【中文标题】在 SQL Server 中将值分配给类似列后,使用 SSIS 将 Oracle 表列更新为 Null【英文标题】:USE SSIS to update Oracle table column with Null after the value has been assigned in SQL Server to a similar column 【发布时间】:2021-12-28 18:56:45 【问题描述】:我在 Oracle 中有一个包含以下列的数据表:
Record_ID, Run_ID, PO_Type, PO_NUM, DateTime
创建 PO 时,会填充除 Run_ID
之外的所有列:
Record_ID, Run_ID, PO_Type, PO_Num, DateTime
---------------------------------------------------
1374, , NEW_PO , 12345 , 20211117123456
1375, , NEW_PO , 12346 , 20211117123545
这些记录目前通过 SSIS 从我们的系统中导出,然后再导入 SQL Server 数据库。在这里他们将被分配一个RUN_ID
,这对于所有导出的数据运行都是唯一的(一次导出的所有数据都将具有相同的Run_ID
):
RECORDID, SYSTEM, RUN_ID, PO_TYPE, PO_NUM, DATETIME
---------------------------------------------------------
1374, ORDER , 5078 , NEW_PO , 12345 , 20211117123456
1375, ORDER , 5078 , NEW_PO , 12346 , 20211117123545
然后我需要将此Run_ID
写回Oracle 数据库,并将PO_TYPE
从NEW_PO
更新为Processed_PO
,这样我的Oracle 数据库将如下所示:
Record_ID, Run_ID, PO_Type , PO_Num, DateTime
--------------------------------------------------------
1374, 5078 , Processed_PO , 12345 , 20211117123456
1375, 5078 , Processed_PO , 12346 , 20211117123545
我遇到的问题是,这一切都需要在同一个 SSIS pull 中发生,因为它是我唯一可用的工具,我不知道如何开始解决这个问题,所以任何关于这将不胜感激。
【问题讨论】:
正确的解决方案可能完全取决于如何生成 RUN_ID 并将其分配给 MSSQL 端的行。您可能还需要考虑时间问题,因此您在 Oracle 端如何选择要导出的行也很重要。 我有不同的数据流任务,即 1) 从 Oracle DB 中提取数据 2) 将不同的 Run_ID 分配给 MS_SQL 数据,我希望第三个数据流任务对 Oracle 进行更新,所以到目前为止还没有生成 Run_ID 的机会。 RUN_ID 是从 SQL 表生成的。在数据流任务 2 中,SQL 是 Update SQL_PO Set Run_ID = RUN_ID_TRACKER.RUN_ID 然后另一个 SQL 任务执行 Update RUN_ID_TRACKER SET RUN_ID = RUN_ID + 1 您不能简单地添加一个任务,使用您想要的 RUN_ID 在 Oracle 表上运行更新语句吗?将 run_id 存储在包内的用户变量中,并将其用于 Oracle 更新。 @MplsDBA,我正在尝试按照这些方式做一些事情,是的。但我也想确保我只更新我提取的 Record_ID(可能在拉取时其他 PO 可能已添加到系统中,我不想冒更新其中一个的风险当它们实际上没有被处理时使用 Run_ID。)所以我确实认为一种方法来验证已处理的 Record_ID 是否是获得正确 Run_ID 的方法是一种很好的方法,因此应该采用某种检查和平衡方法被包括在内。 【参考方案1】:鉴于您提供的其他有用信息,我现在了解到您的担忧主要在于确保只有您提取的行是您稍后使用 RUN_ID 更新的行。
我能看到的最简单的方法是使用 PO_TYPE 列并引入类似“PO_Processing”的新状态。我不知道您的环境/数据模型,因此这可能可行,也可能不可行 - 也许您对可以在此处输入的内容有限制 - 但 SSIS 包步骤将如下所示:
-
更新所需的 Oracle 行
update oracle_table set po_type = 'In_Transit_PO' where <your criteria>
-
使用此状态作为选择标准执行您的数据提取
将数据加载到 SQL Server 中
将新的 RUN_ID 存储在包中的用户变量中
使用用户变量更新 SQL Server 行
update SQL_PO set Run_ID = (?) where <your criteria> ('?' maps to your defined package variable)
-
更新 RUN_ID_TRACKER 以增加下一个 RUN_ID
使用用户变量通过映射来更新 Oracle 行(确切的语法可能略有不同,具体取决于您的包配置使用的提供程序)
update oracle_table set PO_Type = 'Processed_PO', RUN_ID='?' where PO_Type = 'In_Transit_PO'
这样做,您允许在负载运行时在 Oracle 端生成新的 PO,但您确保只有您提取的行是您使用 RUN_ID 更新的行。包中有几个额外的步骤,但每个步骤都非常简单。不仅如此,如果过程中出现错误,您可以准确记录它尝试处理的记录子集,从而使调试更容易。
想一想,您可以通过获取 run_id 值并将其放入变量 before 加载步骤来稍微减少步骤,然后在插入行 - 无需对 SQL_PO 表进行二次更新。
【讨论】:
以上是关于在 SQL Server 中将值分配给类似列后,使用 SSIS 将 Oracle 表列更新为 Null的主要内容,如果未能解决你的问题,请参考以下文章
VBScript - 在 SQL Server 中将 SHA1 存储为数字或二进制值
如何将插入的输出值分配给 sql server 中的变量? [复制]