SQL Server 2008的Transact-SQL语言增强(四)

日期: 2008-09-08 作者:zhanghongju 来源:TechTarget中国

  6.MERGE 语句


  在SQL Server 2008中,可以使用MERGE语句在一条语句中根据与源表联接的结果对目标表执行 insert、update或delete操作。如:使用一个语句有条件地在单个目标表中插入或更新行,如果目标表中存在相应行,则更新一个或多个列;否则,会将数据插入新行。使用该语句还可以同步两个表,根据与源数据的差别在目标表中插入、更新或删除行。


  MERGE 语法包括如下五个主要子句:


  MERGE 子句用于指定作为插入、更新或删除操作目标的表或视图。


  USING 子句用于指定要与目标联接的数据源。


  ON 子句用于指定决定目标与源的匹配位置的联接条件。


  WHEN 子句用于根据 ON 子句的结果指定要执行的操作。


  OUTPUT 子句针对更新、插入或删除的目标对象中的每一行返回一行。


  其完整的语法格式如下:  







 [ WITH [,…n] ] 
  MERGE 
  [ TOP ( expression ) [ PERCENT ] ] 
  [ INTO ] target_table [ WITH ( ) ] [ [ AS ] table_alias ] 
  USING  
  ON  
  [ WHEN MATCHED [ AND ] 
  THEN ] 
  [ WHEN NOT MATCHED [ BY TARGET ] [ AND ] 
  THEN ] 
  [ WHEN NOT MATCHED BY SOURCE [ AND ] 
  THEN ] 
  [ ] 
  [ OPTION ( [ ,…n ] ) ] 

  使用下面的语句创建两个表:     








 USE AdventureWorks; 
  GO 
  IF OBJECT_ID (N’dbo.Purchases’, N’U’) IS NOT NULL 
  drop TABLE dbo.Purchases; 
  GO 
  create TABLE dbo.Purchases ( 
  ProductID int, CustomerID int, PurchaseDate datetime, 
  CONSTRAINT PK_PurchProdID PRIMARY KEY(ProductID,CustomerID)); 
  GO 
  insert INTO dbo.Purchases VALUES(707, 11794, ’20060821’), 
  (707, 15160, ’20060825’),(708, 18529, ’20060821’), 
  (712, 19072, ’20060821’),(870, 15160, ’20060823’), 
  (870, 11927, ’20060824’),(870, 18749, ’20060825’); 
  GO 
  IF OBJECT_ID (N’dbo.FactBuyingHabits’, N’U’) IS NOT NULL 
  drop TABLE dbo.FactBuyingHabits; 
  GO 
  create TABLE dbo.FactBuyingHabits ( 
  ProductID int, CustomerID int, LastPurchaseDate datetime, 
  CONSTRAINT PK_FactProdID PRIMARY KEY(ProductID,CustomerID)); 
  GO 
  insert INTO dbo.FactBuyingHabits VALUES(707, 11794, ’20060814’), 
  (707, 18178, ’20060818’),(864, 14114, ’20060818’), 
  (870, 17151, ’20060818’),(870, 15160, ’20060817’), 
  (871, 21717, ’20060817’),(871, 21163, ’20060815’), 
  (871, 13350, ’20060815’),(873, 23381, ’20060815’); 


  GO 


   两个表中的数据如下图所示: 


  SQL Server 2008的Transact-SQL语言增强图八
  请注意,这两个表中有两个共有的产品-客户行:客户 11794 购买了产品 707,客户 15160 购买了产品 870。对于这些行,可以使用 WHEN MATCHED THEN 子句利用 Purchases 中这些购买记录的日期来更新 FactBuyingHabits。我们可以使用 WHEN NOT MATCHED THEN 子句将所有其他行插入 FactBuyingHabits。参考下面的语句:      







MERGE dbo.FactBuyingHabits AS Target 
  USING (select CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source 
  ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID) 
  WHEN MATCHED THEN 
  update SET Target.LastPurchaseDate = Source.PurchaseDate 
  WHEN NOT MATCHED BY TARGET THEN 
  insert (CustomerID, ProductID, LastPurchaseDate) 
  VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate) 
  OUTPUT $action, inserted.*, deleted.*; 



  $action用于在 OUTPUT 子句中指定一个 nvarchar(10) 类型的列,列的值是代表所执行操作的insert、update或delete。inserted.*和deleted.*分别用于指定返回所有插入行的列和删除行的列。如果要指定具体的列,可以使用inserted.ProductID这样的命名方式。


  上面语句的输出结果如下: 


  SQL Server 2008的Transact-SQL语言增强图九

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐

  • SQL Server 2008将退出微软主流数据库支持

    你的企业是否还在运行SQL Server 2008?请注意微软为SQL Server 2008提供的主流技术支持服务将于今年的7月8日正式结束。

  • 了解SQL Server 2012的存储过程功能

    在应用新版本的SQL Server数据库之前,一些指导性的建议是非常有必要的。为此,专家的建议是了解一些更多存储过程新功能。

  • SQL Server 2008中的对称密钥加密

    证书和非对称密钥使用数据库级的内部公钥加密数据,并且使用数据库级内部私钥解密数据。而对称密钥相对简单,它们包含一个同时用来加密和解密的密钥。

  • 通过PassPhrase对SQL Server 2008加密

    与数字证书类似,SQL Server 证书包括公钥和私钥这一对密钥,它们都用来加密和解密数据。SQL Server也拥有创建非对称密钥和对称密钥对象的能力。