哪个SSIS转换可以执行SQL查询中使用的"NOT IN"约束?

Des*_*esu 3 ssis

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

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

TMP_CTACTE_S_USD
----------------
CON_OPE numeric(20,0)
Run Code Online (Sandbox Code Playgroud)

我需要减去这两个表之间的所有相似值,并保持不同的行.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)
Run Code Online (Sandbox Code Playgroud)

最后,通过新表TMP_CYA我可以继续我的工作.

这种方法的问题在于TMP_CRUZTRANS有500万行,所以使用执行SQL任务将所有这些数据插入表中非常慢.执行此操作大约需要5个小时.这就是我需要在数据流任务中执行此操作的原因.

小智 7

您可以使用Lookup transformation数据流任务中的可用来满足您的要求.

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

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

以下是数据流任务代替您当前使用的执行SQL任务的方式.

数据流任务

配置Lookup transformation如下所示:

在"常规"选项卡页面上,选择" Redirect rows to no match output自",Specify how to handle rows with no matching entries因为您只对非匹配行感兴趣.

查找转换一般

在"连接"选项卡页上,选择相应的OLE DB连接管理器,然后选择表dbo.TMP_CTACTE_S_USD.这是您要验证数据的表.

查找转换连接

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

查找转换列

查找转换OLE DB目标连接时,将出现" 输入输出选择"对话框.请务必选择Lookup No Match Output.

这是执行包之前的示例.

执行前

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

执行

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

执行后

希望有所帮助.