WEB开发网
开发学院数据库MSSQL Server SQL Server 2008对T-SQL语言的增强 阅读

SQL Server 2008对T-SQL语言的增强

 2007-12-04 09:52:36 来源:WEB开发网   
核心提示: 7. MERGE 语句这个新增的 Transaction SQL 语句在一个基于源数据连接结果集的目标表上执行 INSERT、UPDATE 和 DELETE 操作,该语法允许您将一个数据源连接到目标表或视图上,SQL Server 2008对T-SQL语言的增强(4),然后在连接后的结果集

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 的新版本发布后快速建立基于该版本的企业级应用程序。

上一页  1 2 3 4 

Tags:SQL Server SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接