---
title: "MapForce 支持 SQL 合并操作，但只有在它是最合适的工具时才应使用"
date: "2016-11-01"
categories: 
  - "data-integration"
  - "tools"
tags: 
  - "database-mapping"
  - "etl"
  - "mapforce"
  - "sql-bulk-merge"
description: 探索 Altova MapForce 如何通过支持针对大型数据库的 SQL 合并操作，从而提高 ETL（数据抽取、转换、加载）的效率，并实现批量插入和更新操作。
---
Status: #blog

Tags:  #database-mapping #etl #mapforce #sql-bulk-merge

Categories: [data-integration](/blog/zh/category/data-integration.md) | [database + sql](/blog/zh/category/database-sql.md)
# MapForce 支持 SQL 合并操作，但只有在它是最合适的工具时才应使用

大型数据库表可以轻松包含数百万，甚至数亿条数据。负责维护这些大型数据集的数据库管理员和其他人员，总是关注 ETL（提取、转换和加载）操作、更新以及其他 SQL 查询的执行时间。为了提高这些操作的效率，一些（但并非所有）数据库供应商实现了 SQL 合并语句，该语句可以将数据批量插入或更新现有表的行，而无需为每一行都使用单独的语句。

Altova MapForce 能够自动支持 SQL 关联功能，前提是该功能适用于当前的数据源 [目标数据库](https://www.altova.com/zh/mapforce/database-mapping.html). 我们来看一个例子。

![shutterstock_66084286 (这部分可以理解为图片编号或文件名，无需翻译)](/blog/images/shutterstock_66084286.jpg)

<!--more-->

### 插入与更新 - 如果

以下图片展示了从 XML 文件中的元素到数据库表的“数据映射”关系。

![Altova MapForce 数据库映射工具](/blog/images/database-mapping.png)

默认情况下，MapForce 会为源文件中每个 "Person" 元素生成一个 SQL 插入语句，这对于向一个全新的、空数据库表中填充数据是合适的。但在其他情况下，例如同步备份副本与实时数据集时，插入语句并不适用。MapForce 允许您方便地为每个数据库映射指定正确的 SQL 操作。

只需点击目标数据库表旁边的“操作”图标，例如，在上面的示例中，点击“Person”表旁边的“操作”图标，即可打开“MapForce 数据库表操作”对话框。下图展示了下拉菜单功能，该功能允许您将 SQL 插入语句更改为“更新-如果”。

![在 Altova MapForce 中，设置“更新”操作](/blog/images/set-update-if-action.png)

更新：如果需要设置条件。在这个映射中，我们希望更新数据库中的记录，条件是源数据包含已存在的键。同时，我们希望插入新行，条件是源数据中的键在数据库中不存在。

这通常被称为“如果...则更新/插入”操作。

“数据库表操作”对话框允许我们定义用于更新的条件，并在条件不成立时执行备选操作。以下展示了完整的操作集合，该集合定义了“如果...则更新，否则插入”的逻辑：

![已完成更新：MapForce 中的操作现在支持 SQL 合并功能](/blog/images/CompletedAction.png)

### 增量更新与批量合并

到目前为止，我们甚至还没有提到用于目标表的数据库供应商。这是因为，无论使用哪种流行的数据库，MapForce 的映射配置都是以相同的方式进行的。 无论目标数据库是否支持 SQL 合并功能，我们都不需要进行任何不同的操作。

当我们在数据库映射设计下方点击“MapForce 输出”选项卡时，MapForce 会生成一个针对特定数据库类型的 SQL 脚本。该脚本随后会显示在 MapForce 的输出窗口中，供用户查看。请注意，该脚本不会自动执行。

如果目标数据库支持 SQL Merge 语句，您会在脚本的开头附近看到一个 MERGE 语句。

![已完成更新：MapForce 中的操作现在支持 SQL 合并功能](/blog/images/SQL-with-merge2.png)

如果目标数据库不支持 SQL Merge 语句，您将看到针对源数据每一行分别对应的 UPDATE...WHERE 语句。

![MapForce 脚本，用于处理不支持 SQL 合并操作的数据库](/blog/images/SQL-with-update2.png)

您可以在 MapForce 中直接执行脚本，方法是从“MapForce 输出”菜单中选择“运行 SQL 脚本”选项。或者，您可以将映射关系保存为可执行文件，然后在 MapForce Server 中自动执行它，并在运行时指定输入文件名。

如果目标数据库支持SQL Merge功能，无论映射是否直接由MapForce执行，或者通过MapForce Server进行自动化，都会生成合并语句。MapForce 2017支持SQL Server 2008及更高版本、Oracle、IBM DB2和Firebird数据库的SQL Merge语句。

在Altova的内部测试中，我们发现使用MapForce Server批量执行SQL Merge操作，其效率可以比之前的技术提高高达15倍。*

*注：此处为Altova内部测试结果，具体效果可能因实际应用场景而异

[点击此处](https://www.altova.com/zh/mapforce/database-mapping.html) 了解更多关于使用 MapForce 进行数据库映射的信息，包括支持的数据库的完整列表，这些数据库可以用作数据映射的源或目标。或者，[点击此处](https://www.altova.com/zh/download-trial.html) 下载一个免费的、功能齐全的 30 天试用版。 本博客文章中使用的映射文件以 MapForce 示例的形式提供，详细的重现映射步骤请参考 MapForce 帮助文档。

 

* 性能结果基于 Altova 内部测试得出。您的实际结果可能有所不同。
