适用于:SQL Server
Azure 数据工厂中的 SSIS 集成运行时
在SQL Server Integration Services的当前版本中,执行 SQL 任务中的 SQL 语句可以包含语句MERGE。 此MERGE语句可让您在单个语句中完成多个INSERT、UPDATE和DELETE操作。
若要在 MERGE 包中使用语句,请执行以下步骤:
创建一个数据流任务,用于加载、转换源数据,并将其保存到临时表或暂存表中。
创建包含该语句的 MERGE Execute SQL 任务。
将数据流任务连接到执行 SQL 任务,并使用暂存表中的数据作为 MERGE 语句的输入。
注意
虽然在这种情况下,MERGE 语句通常需要一个暂存表,但 MERGE 语句的性能通常优于 Lookup 转换执行的逐行查找。 MERGE在查找表体积过大,可能耗尽“查找”转换用于缓存其引用表的可用内存时,此方法同样有用。
使用 MERGE
通常,如果要将包括插入、更新和删除在内的更改应用于另一个表,请使用 MERGE 该语句。 在 SQL Server 2008 (10.0.x)之前,此过程需要一个查找转换和多个 OLE DB 命令转换。 查找转换执行逐行查找,以确定每一行是新行还是经过更改的行。 随后,OLE DB 命令转换执行了必要的 INSERT、UPDATE 和 DELETE 操作。 从 2008 年 SQL Server (10.0.x)开始,单个MERGE语句可以替换查找转换和相应的 OLE DB 命令转换。
MERGE配合增量加载
变更数据捕获功能是 SQL Server 2008 (10.0.x) 中的新增功能,使用该功能可以方便可靠地对数据仓库执行增量加载。 作为使用参数化 OLE DB 命令转换来执行插入和更新的替代方法,可以使用 MERGE 该语句合并这两个操作。
有关详细信息,请参阅 将变更应用到目标。
MERGE 在其他场景中
在以下情形中,可以在 Integration Services 包外部或内部使用 MERGE 语句。 不过,从多个异类源加载此数据以及随后合并和清除该数据通常都需要 Integration Services 包。 因此,您可以考虑为方便起见并便于维护,在包中使用 MERGE 语句。
跟踪购买习惯
数据仓库中的 FactBuyingHabits 表会跟踪客户购买指定产品的最后日期。 该表由 ProductID、CustomerID 和 PurchaseDate 列组成。 事务性数据库每周都会生成一个包括该周采购情况的 PurchaseRecords 表。 目标是使用单个 MERGE 语句将 PurchaseRecords 表中的信息合并到 FactBuyingHabits 表中。 对于不存在的产品-客户配对,MERGE语句会插入新行。 对于已存在的产品-客户对,MERGE 语句会更新最近一次购买日期。
跟踪价格历史记录
DimBook 表表示某书商库存中的图书列表,并标识每本书的价格历史记录。 此表包括以下列:ISBN、ProductID、Price、Shelf 和 IsCurrent。 此表还将书的每个价格显示为一行。 其中一行显示的是当前价格。 为了指示哪一行包含当前价格,该行的 IsCurrent 列的值设置为 1。
该数据库每周会生成一个 WeeklyChanges 表,其中包含该周的价格更改以及该周添加的新书。 通过使用单个 MERGE 语句,可以将 WeeklyChanges 表中的更改应用于 DimBook 表。 该 MERGE 语句为新添加的书籍插入新行,对于价格已更改的现有书籍行,将 IsCurrent 列更新为 0。 该 MERGE 语句还会为价格已更改的书籍插入新行,对于这些新行,将 IsCurrent 列的值设置为 1。
将具有新数据的表与旧表合并
该数据库使用“开放式架构”(即,包含各属性的名称-值对的表)对对象的属性进行建模。 Properties 表具有三列:EntityID、PropertyID 和 Value。 NewProperties 表是 Properties 表的更新版本,应与 Properties 表保持同步。 若要同步这两个表,可以使用单个 MERGE 语句执行以下操作:
从 Properties 表中删除 NewProperties 表中不存在的属性。
使用 NewProperties 表中找到的新值更新 Properties 表中的属性值。
插入在 NewProperties 表中存在但在 Properties 表中不存在的新属性。
此方法在类似复制方案的方案中非常有用,此方案的目标是使两台服务器上的两个表中的数据保持一致。
跟踪库存
Inventory 数据库具有一个 ProductsInventory 表,该表具有 ProductID 列和 StockOnHand 列。 具有 ProductID、CustomerID 和 Quantity 列的 Shipments 表用于跟踪向客户发货的产品情况。 ProductInventory 表应根据 Shipments 表中的信息每天更新。 单个 MERGE 语句可根据已发货情况减少 ProductInventory 表中的库存。 如果产品的库存已减少到 0,该 MERGE 语句还可以从 ProductInventory 表中删除该产品行。