3

我有两个具有相似列的 OLEDB 数据源:

TMP_CRUZTRANS
-------------
CUENTA_CTE numeric (20,0)

TMP_CTACTE_S_USD
----------------
CON_OPE numeric(20,0)

我需要减去这两个表之间的所有相似值并保留不同的行。SSIS 中是否有可以执行NOT INSQL 查询中通常使用的约束的转换/任务?

目前,我正在使用Execute SQL Taskon执行此操作Control Flow

在此处输入图像描述

顶部数据流创建第一个表TMP_CRUZTRANS(合并其他 2 个表之间的连接......但我想这对我的问题并不重要)我需要在第二个表中保留不同的值。

在 中Execute SQL Task,我有以下声明:

INSERT  INTO [dbo].[TMP_CYA] 
SELECT RUT_CLIE, CUENTA_CTE, MONTO_TRANSAC 
FROM [dbo].[TMP_CRUZTRANS]
WHERE CUENTA_CTE NOT IN (SELECT CON_OPE FROM TMP_CTACTE_S_USD)

最后,有了这张新桌子,TMP_CYA我可以继续我的工作了。

这种方法的问题是TMP_CRUZTRANS得到了大约 500 万行,因此使用 Execute SQL Task 将所有这些数据插入到表中非常慢。执行此操作大约需要 5 个小时。这就是为什么我需要在数据流任务中执行此操作。

4

1 回答 1

7

您可以Lookup transformation在 Data Flow 任务中使用 available 来实现您的要求。

这是一个示例,说明了您要实现的目标。

创建带有数据流任务的包。在数据流任务中,使用 OLE DB Source 从源表中读取数据TMP_CRUZTRANS。使用查找转换来验证dbo.TMP_CTACTE_S_USD给定列之间的表是否存在值。然后将不匹配的输出重定向到 OLE DB 目标以将行插入表中dbo.TMP_CYA

以下是数据流任务代替您当前使用的执行 SQL 任务的样子。

数据流任务

配置Lookup transformation如下图:

在 General 选项卡页上,选择Redirect rows to no match outputfrom,Specify how to handle rows with no matching entries因为您只对不匹配的行感兴趣。

查找转换一般

在 Connection 选项卡页面上,选择适当的 OLE DB Connection manager 并选择表 dbo.TMP_CTACTE_S_USD。这是您要验证数据的表。

查找转换连接

在 Columns 选项卡页面上,将 CUENTA_CTE 列拖放到 CON_OPE 上,以建立源表和查找表之间的映射。单击确定。

查找转换列

当您将Lookup 转换OLE DB Destination连接时,将出现Input Output Selection对话框。请务必选择Lookup No Match Output

这是执行包之前的示例。

执行前

您可以看到只有 2 行不匹配的行已传输到 OLE DB 目标。

执行

您可以注意到,在包执行后,目标表现在包含两个不匹配的行。

执行后

希望有帮助。

于 2013-01-30T15:03:19.933 回答