在本文中,我们将通过示例向您展示配置 SSIS 增量加载的更好方法。我们已经在之前的案例中解释了增量加载,但我们使用了 OLE DB 命令转换来更新目标表中的记录。虽然这种方法适用于少量数据,但对于大型数据集,会存在性能问题。
在本例中,我们将向您展示配置 SSIS 增量加载的步骤。在开始创建包之前,让我们先看看源数据。

现在让我们也看看目标表中的数据。

我们的任务是将额外的 4 条记录加载到目标表中,并更新第 2、5、10 行中存在的数据。
配置 SSIS 增量加载
OLE DB 命令转换以逐行方式执行更新,这非常耗时。在本例中,我们将创建一个临时表或暂存表来存储更新的信息,然后通过执行 SQL 任务将这些记录传递到目标表。
步骤 1:将“数据流任务”和两个执行 SQL 任务从工具箱拖放到控制流区域,并将第一个执行任务重命名为“创建暂存表”,数据流任务重命名为“SSIS 增量加载”,最后一个任务重命名为“更新目标表”。
- 创建暂存表:这可以是一个全局临时表或任何用于存储更新信息的永久表。每次包运行时,现有表都会被删除并重新创建。请记住,您也可以使用 TRUNCATE 语句来截断表,而不是删除和重新创建。
- 数据流任务:将数据从源加载到目标
- 更新目标表:使用暂存表中的数据更新目标表数据

步骤 2:双击“执行 SQL 任务”将打开任务编辑器。在这里,我们将在目标数据库上创建暂存表,因此我们选择了指向数据库的已创建 OLE DB 连接管理器。请点击“SQL 语句”属性旁边的浏览按钮来编写自定义 SQL 语句。

我们在上面截图中使用的 SQL 命令是
-- DROPPING EXISTING TABLE
IF OBJECT_ID('CDC_Staging', 'U') IS NOT NULL
DROP TABLE CDC_Staging;
-- CREATING NEW TABLE
CREATE TABLE CDC_Staging
(
[Employee_ID] [int] PRIMARY KEY NOT NULL,
[FirstName] [nvarchar](255) NULL,
[LastName] [nvarchar](255) NULL,
[Education] [nvarchar](255) NULL,
[Occupation] [nvarchar](255) NULL,
[YearlyIncome] [float] NULL,
[Sales] [float] NULL
);
点击“确定”完成暂存表的创建。

接下来,双击“数据流任务”以打开数据流选项卡。
步骤 3:将 OLE DB 源从工具箱拖放到数据流区域。双击数据流区域中的 OLE DB 源将打开 OLE DB 连接管理器设置。从下方,您可以观察到我们已选择以下数据库作为源数据库,选择 [CDC Source] 作为源表。

步骤 4:点击“列”选项卡以验证列。您可以取消选中不需要的列(如果有)。

点击“确定”关闭 OLE DB 源,然后拖放查找转换。

步骤 5:双击“查找转换”将打开“查找转换编辑器”以配置查找表(引用表)。在“常规”选项卡下,“指定如何处理不匹配的行”部分,将默认的“失败组件”更改为“忽略失败”选项。
提示:请参考查找文章来理解存在的属性,参考查找转换文章来理解配置设置。

步骤 6:点击“连接”选项卡以配置查找连接设置。如果您已创建 OLE DB 连接管理器,则从列表中选择;否则,点击“新建”按钮并进行设置。这里我们选择了指向数据库的现有连接。
接下来,我们将使用 SQL 查询作为查找表,因为我们只需要一个列进行查找(即 Employee_ID),因此我们使用如下所示的查询。

步骤 7:点击“可用输入列”,然后将所需的列拖放到可用的查找列上,以在两个数据集之间创建连接。源数据中的 Employee_ID 列将与查找表(即目标表)中的 [Employee_ID] 列进行匹配。

步骤 8:拖放条件拆分转换,并将“查找匹配输出”作为源连接到条件拆分。

步骤 9:双击它以提供条件。在此 SSIS 增量加载示例中使用的条件是 ISNULL (LKP_Employee_ID)。这意味着条件拆分会验证查找的 Employee ID 是否为 Null。
- 如果 LKP_Employee_ID 为 Null,则表示目标表中不存在该记录,因此我们希望插入新记录。
- 如果 LKP_Employee_ID 不为 Null,则表示目标表中已存在该记录,因此我们希望使用新数据更新现有数据。
从下方的图像可以看到,我们在“条件拆分转换”中使用了 1 个条件和 1 个默认输出。因此,我们总共得到两个输出。

步骤 10:将两个 OLE DB 目标拖放到数据流区域,然后将输出箭头拖到新的 OLE DB 目标。会出现一个名为“输入输出选择”的弹出窗口,帮助您选择输入输出类型:INSERT 或 UPDATE。

步骤 11:双击第一个 OLE DB 目标将打开 OLE DB 目标编辑器。选择 OLE DB 连接管理器,并选择数据库中存在的 [CDC Target] 表以插入新记录。

步骤 12:点击“映射”选项卡以验证源列是否正确映射到目标列。如果您观察到下面的图像,我们没有为 Employee_ID 列进行映射,因为它是自动递增的标识列。

步骤 13:双击第二个 OLE DB 目标将打开 OLE DB 目标编辑器。选择 OLE DB 连接管理器,并选择数据库中存在的 [CDC_Staging] 表。
提示:如果找不到表,请单独运行第一个执行 SQL 任务来创建它。

步骤 14:重复步骤 12。

在进入控制流选项卡之前,请将“验证外部元数据”从 TRUE 改为 FALSE,因为我们是在运行时(运行时)动态创建暂存表。

步骤 15:在控制流中,双击第二个执行 SQL 任务以打开任务编辑器。在这里,我们正在使用暂存表数据更新 [CDC Target] 数据。因此,我们选择了指向数据库的已创建 OLE DB 连接管理器。请点击“SQL 语句”属性旁边的浏览按钮来编写自定义语句。

为了更新记录,我们在上述 SSIS 增量加载屏幕截图中使用的 SQL 命令是:
UPDATE [dbo].[CDC Target]
SET [FirstName] = Staging.[FirstName]
,[LastName] = Staging.[LastName]
,[Education] = Staging.[Education]
,[Occupation] = Staging.[Occupation]
,[YearlyIncome] = Staging.[YearlyIncome]
,[Sales] = Staging.[Sales]
FROM [CDC Target]
INNER JOIN
[CDC_Staging] AS Staging
ON [CDC Target].Employee_ID = Staging.Employee_ID
点击“确定”完成 SSIS 增量加载包的配置。让我们运行该包。

让我们打开 SQL Server 管理工作室,检查我们是否使用 SSIS 增量加载(带暂存表)插入了新记录并更新了旧记录。

评论已关闭。