解析SQL Server 2008对T-SQL语言的增强(4)_Mssql数据库教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:解读SQL Server数据库备份的方法
SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式。下面将主要讨论一下后者的备份与恢复。

7. MERGE 语句

这个新增的 Transaction SQL 语句在一个基于源数据连接结果集的目标表上执行 INSERT、UPDATE 和 DELETE 操作。该语法允许您将一个数据源连接到目标表或视图上。然后在连接后的结果集上执行多种操作。

MERGE 的语法为:

以下为引用的内容:

[WITH<common_table_expression>[,...n]]
MERGE 
[TOP(expression)[PERCENT]] 
[INTO]target_table[[AS]table_alias]
    [WITH(<merge_hint>)]
USING<table_source>
ON<search_condition>
[WHENMATCHED[AND<search_condition>]
    THEN<merge_matched>]
[WHEN[TARGET]NOTMATCHED[AND<search_condition>]
    THEN<merge_not_matched>]
[WHENSOURCENOTMATCHED[AND<search_condition>]
    THEN<merge_matched>]
<output_clause>
[OPTION(<query_hint>[,...n])]  
;
<merge_hint>::=
    {[<table_hint_limited>[,...n]]
  [[,]INDEX(index_val[,...n])]}
<table_source>::= 
{
    table_or_view_name[[AS]table_alias][<tablesample_clause>] 
        [WITH(table_hint[[,]...n])] 
  |rowset_function[[AS]table_alias] 
        [(bulk_column_alias[,...n])] 
  |user_defined_function[[AS]table_alias]
  |OPENXML<openxml_clause> 
  |derived_table[AS]table_alias[(column_alias[,...n])] 
  |<joined_table> 
  |<pivoted_table> 
  |<unpivoted_table> 
}
<merge_matched>::=
        {UPDATESET<set_clause>|DELETE}
<set_clause>::=
  {column_name={expression|DEFAULT|NULL}
 |{udt_column_name.{{property_name=expression 
    |field_name=expression} 
    |method_name(argument[,...n])}}
 |column_name{.WRITE(expression,@Offset,@Length)}
 |@variable=expression 
  }[,...n] 
<merge_not_matched>::=
    INSERT[(<column_list>)] 
        {VALUES(<values_list>)
      |DEFAULTVALUES}
<output_clause>::=
{
  [OUTPUT<dml_select_list>INTO{@table_variable|output_table}
    [(column_list)]]
    [OUTPUT<dml_select_list>]
}
<dml_select_list>::=
{<column_name>|scalar_expression}[[AS]column_alias_identifier]
  [,...n]
<column_name>::=
  {DELETED|INSERTED|from_table_name}.{*|column_name}
 |$ACTION

示例:在一条 SQL 语句中使用 WHERE 在一张表上执行 UPDATE 和 DELETE 操作

以下为引用的内容:

USEAdventureWorks;
GO
MERGEProduction.ProductInventoryASpi
USING(SELECTProductID,SUM(OrderQty)FROMSales.SalesOrderDetailsod
  JOINSales.SalesOrderHeadersoh
  ONsod.SalesOrderID=soh.SalesOrderID
  ANDsoh.OrderDate=GETDATE()
  GROUPBYProductID)ASsrc(ProductID,OrderQty)
ON(pi.ProductID=src.ProductID)
WHENMATCHEDANDpi.Quantity-src.OrderQty<>0 
  THENUPDATESETpi.Quantity=pi.Quantity-src.OrderQty
WHENMATCHEDANDpi.Quantity-src.OrderQty=0 
  THENDELETE;

这个示例是一个非常典型的销售定货库存问题。这个示例很简单,表达的意思就是:如果某一个产品产生了销售定单数据,则将其对应的产品库存除去该销售定单所产生的数量,如果当前库存数量与该销售定单数量相同,则从库存表中删除该产品的库存纪录。

我们看到,利用 MERGE 语句可以将复杂的 SQL 语句简化。它比起 IF、CASE 等更加灵活和强大。

结论

Microsoft SQL Server 2008 对事务性 SQL 语言做了一些增强,提高了查询效率。使得 SQl Server 成为大中型企业数据库的首先产品。SQL Server 2008 将伴随 Visual Studio 2008 一起发布,开发人员提前了解这些信息有助于在 SQL Server 的新版本发布后快速建立基于该版本的企业级应用程序。

分享:解析SQL 2008的Change Data Capture功能
在常见的企业数据平台管理中有一项任务是一直困扰SQL Server DBA们的,这就是对数据更新的监控。很多数据应用都需要捕获对业务数据表的更新。笔者见过几种解决方案: 1、在数

共4页上一页1234下一页
来源:模板无忧//所属分类:Mssql数据库教程/更新时间:2009-08-01
相关Mssql数据库教程

Mssql数据库教程Rss订阅编程教程搜索

Mssql数据库教程推荐

猜你也喜欢看这些