SQL Server 2012中新的T-SQL命令第二部分

日期: 2012-07-10 作者:Serdar Yegulalp翻译:冯昀晖 来源:TechTarget中国 英文

编者按:本系列文章是关于SQL Server 2012中新命令的介绍,共分两部分,本文是第二部分。文中回顾了序列编号和数据类型转换的调整。系列文章的第一部分介绍了存储过程和错误处理的变化。   我经常能听到Oracle DBA对SQL Server DBA说:“你终于可以使用那个新功能特性了吗?为什么这么晚,我们Oracle用户已经使用很多年了。

”每当这个时候,我恨不得找个地缝钻进去。不过现在Oracle用户们终于可以不再对SQL Server开发者趾高气昂了,因为我们有了“SEQUENCE”对象。   序列号的功能多少有点类似标识列,只是它们没有绑定到特定表,而是绑定到了给定的模式对象。在创……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

编者按:本系列文章是关于SQL Server 2012中新命令的介绍,共分两部分,本文是第二部分。文中回顾了序列编号和数据类型转换的调整。系列文章的第一部分介绍了存储过程和错误处理的变化。

  我经常能听到Oracle DBA对SQL Server DBA说:“你终于可以使用那个新功能特性了吗?为什么这么晚,我们Oracle用户已经使用很多年了。”每当这个时候,我恨不得找个地缝钻进去。不过现在Oracle用户们终于可以不再对SQL Server开发者趾高气昂了,因为我们有了“SEQUENCE”对象。

  序列号的功能多少有点类似标识列,只是它们没有绑定到特定表,而是绑定到了给定的模式对象。在创建的时候,该对象会遵从特定规则来定义序列。序列本身设计也不是本着唯一主键的思路,与标识列不同,标识列在整个上下文中智能使用一次——例如,它们可以被应用到表或者用作存储过程循环的一部分。

  我们一起来看一下:

  CREATE SEQUENCE mySchema.Identity
  START WITH 1
  INCREMENT BY 1
  MINVALUE 1
  NO MAXVALUE
  NO CYCLE;

  该命令会创建一个新的序列,从1开始,增量是1,没有最大值限制,而且不会从最小值(MINVALUE)再开始循环重复(CYCLE)。没有最大值本身就意味着不会有循环发生,但是我这么写只是想在这个例子中表示的更清晰一些:

  另外,也可以这么写:

  CREATE SEQUENCE mySchema.Identity2
  START WITH -10
  INCREMENT BY 1
  MINVALUE 1
  MAXVALUE 10
  CYCLE;

  该命令会启动一个序列,从“-10”开始,增量还是1,但最大值是10,达到最大值后会重新从1开始。这样的话,编号和行为序列比ID列更多了一点灵活。例如,你可以在多个表之间共享专门的数字序列,不需要手工编码控制递增(比如使用用户自定义函数实现)来实现。

  要使用序列的值,你可以使用“NEXT VALUE FOR”语句。下面是在“SELECT”语句中使用的一个例子:

  SELECT NEXT VALUE FOR mySchema.Identity as IdentityFromSequence;

  这个命令可以获取“mySchema.Identity”的当前序列值,然后该序列会按照定义规则自动递增。另一种使用形式是在“INSERT”语句中:

  INSERT myTable (myColumn)
  VALUES (NEXT VALUE FOR mySchema.Identity);

  你还可以在变量上下文中使用它:

  SET @myVariable=NEXT VALUE FOR mySchema.Identity;

  “TRY_CONVERT” 和 “TRY_PARSE

  “TRY_CONVERT” 和 “TRY_PARSE”都是新增功能中比较小但是很有用的部分,它们会给转换数据类型带来很大方便。“TRY_CONVERT”把传入的值转换为有效的转换值。如果转换不成,它会返回“null”,而不会抛出错误。请看下面示例:

  SELECT TRY_CONVERT(DATETIME, ‘This is not a date’)

  上面命令会返回“null”。如果你把“null”值用作存储过程处理中的一部分,那么这一点很有用,因为你肯定不想传入值无效时程序被卡死。

  “TRY_PARSE”作为一个变量,它的功能与原来的“PARSE ”命令相同。微软推荐使用“PARSE ”把字符串转换为日期或者数字,而使用“CONVERT ”做更多普通的类型转换。

  DATEFROMPARTS

  该命令基于年月日值返回日期值。例如:

  SELECT DATEFROMPARTS (2012,05,1)

  该存储过程返回日期是2012年五月一日。

  IIF

  这个表达式是从Excel中移植过来的,它本质上是创建“CASE”语句的简写方式:

  SELECT IIF (1>2,’Impossible’,’Possible’)

  第一部分是待验证条件。第二部分是验证条件为真时返回的表达式;第三部分是验证条件为假时返回的表达式。要注意在“IIF”表达式中你最多只能嵌套十层,同样你也只能嵌套十层“CASE”语句。(坦白地讲,如果你嵌套超过十层,你真的需要重新思考你编写“T-SQL”语句的方式了。)

  CONCAT

  这是使用一个或多个值创建字符串的快捷方法,所有参数都会被隐式地转换为字符串。

  SELECT CONCAT(‘Once upon’,’a time’,32+32)

  该命令返回结果为:

  Once upona time64

  要注意数字旁边缺少了空格。“CONCAT ”不会在表达式之间添加空格。

  另外还要注意返回类型很大程度上依赖于提供的参数,可能是“varchar”或者“nvarchar(max)”。通常“CONCAT ”会返回最适合该字符串和传入表达式整体长度的类型。例如:如果没有输入参数用作大对象类型,那么返回类型永远不会超过八千个字符。

  在这些新功能特性中,还有一点东西大家可以用。那些希望加强错误处理的用户有“THROW ”函数可以用了;那些需要自定义数据分页解决方案的用户现在有“OFFSET/FETCH”可以用了;那些希望以更优雅的方式查询重命名存储过程返回结果列的用户有“WITH RESULT SETS”可以用了;那些希望有更灵活的方法处理序列号的用户现在有“sequences”序列可以用了。

作者

Serdar Yegulalp
Serdar Yegulalp

Serdar Yegulalp从1994年到2001年为Windows杂志写作,覆盖了广泛的技术方面。他现在是《The Windows 2000 Power Users Newsletter》一书的出版者,辛勤钻研他擅长的Windows NT, Windows 2000 and Windows XP领域,并为TechTarget写专栏。

相关推荐