SQL Server 2008对T-SQL语言的增强
2007-12-04 09:52:36 来源:WEB开发网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 server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接