SQL Server 2008对T-SQL语言的增强(二)

日期: 2008-06-06 作者:佚名 来源:TechTarget中国

  4.兼容性级别


  新的alter DATABASE SET COMPATIBILITY_LEVEL语法替换了sp_dbcomplevel存储过程。它用来设置特定数据库的兼容性级别。其语法形式为:






  alter DATABASE database_name
  SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 }


  5.用户自定义表数据类型


  现在,SQL Server提供一种新的用户自定义数据类型——自定义表数据类型(User-defined Table Types)。它可以作为参数提供给语句、存储过程或者函数。您还可以为它创建唯一约束和主键。


  请使用create TYPE语句创建这种数据类型。如:
  




  USE AdventureWorks;
  GO
  /* create a user-defined table type */
  create TYPE LocationTableType AS TABLE
  ( LocationName VARchar(50)
  , CostRate INT );
  GO


  对于表类型,有如下约束:
 
    1、用户自定义表类型不能作为表的列或者结构化用户自定义类型的域。


    2、基于用户自定义表类型的别名类型。
 
    3、不允许NOT FOR REPLICATION 选项。
 
    4、CHECK约束需要一个计算列。
 
    5、在计算列上的主键必须包含NOT NULL和PERSISTED约束。


    6、不能在用户自定义表类型上创建非簇索引。除非索引是创建 PRIMARY KEY 或 UNIQUE 约束的返回值。
    7、不能指定 DEFAULT 值。
 
    8、一旦用户自定义表类型被创建,则它就无法更改。


    9、如果没有定义用户自定义表类型上的计算列,则用户自定义函数无法调用。


    6.表值参数


    数据库引擎现在支持一种新的参数类型来引用用户自定义表类型(参考 5)。表值参数可以发送更多的SQL Server数据。下面的示例展示了如何使用表值参数。
  




  USE AdventureWorks;
  GO
  /* create a table type. */
  create TYPE LocationTableType AS TABLE
  ( LocationName VARchar(50)
  , CostRate INT );
  GO
  /* create a procedure to receive data for the table-valued parameter. */
  create PROCEDURE usp_insertProductionLocation
  @TVP LocationTableType READONLY
  AS
  SET NOcount ON
  insert INTO [AdventureWorks].[Production].[Location]
  ([Name]
  ,[CostRate]
  ,[Availability]
  ,[ModifiedDate])
  select *, 0, GETDATE()
  FROM @TVP;
  GO
  /* Declare a variable that references the type. */
  DECLARE @LocationTVP
  AS LocationTableType;
  /* Add data to the table variable. */
  insert INTO @LocationTVP (LocationName, CostRate)
  select [Name], 0.00
  FROM
  [AdventureWorks].[Person].[StateProvince];
  /* Pass the table variable data to a stored procedure. */
  &#101xec usp_insertProductionLocation @LocationTVP;
  GO


   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>
  [ WHEN MATCHED [ AND <search_condition> ]
  THEN <merge_matched> ]
  [ WHEN [TARGET] NOT MATCHED [ AND <search_condition> ]
  THEN <merge_not_matched> ]
  [ WHEN SOURCE NOT MATCHED [ 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>::=
  { update SET <set_clause> | delete }

  <set_clause>::=
  { column_name = { expression | DEFAULT | NULL }
  | { udt_column_name. { { property_name = expression
  | field_name = expression }
  | method_name ( argument [ ,…n ] ) } }
  | method_name ( argument [ ,…n ] ) } }
  | column_name { .WRITE ( expression , @Offset , @Length ) }
  | @variable = expression
  } [ ,…n ]

  <merge_not_matched>::=
  insert [ ( <column_list> ) ]
  { VALUES ( <values_list> )
  | DEFAULT VALUES }

  <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操作 







  USE AdventureWorks;
  GO
  MERGE Production.ProductInventory AS pi
  USING (select ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail sod
  join Sales.SalesOrderHeader soh
  ON sod.SalesOrderID = soh.SalesOrderID
  AND soh.OrderDate = GETDATE()
  GROUP BY ProductID) AS src (ProductID, OrderQty)
  ON (pi.ProductID = src.ProductID)
  WHEN MATCHED AND pi.Quantity – src.OrderQty <> 0
  THEN update SET pi.Quantity = pi.Quantity – src.OrderQty
  WHEN MATCHED AND pi.Quantity – src.OrderQty = 0
  THEN delete; 


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

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

    结论

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

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

作者

佚名
佚名

相关推荐