编者按:本系列文章是关于SQL Server 2012中新命令的介绍,共分两部分,本文是第二部分。文中回顾了序列编号和数据类型转换的调整。系列文章的第一部分介绍了存储过程和错误处理的变化。 我经常能听到Oracle DBA对SQL Server DBA说:“你终于可以使用那个新功能特性了吗?为什么这么晚,我们Oracle用户已经使用很多年了。
”每当这个时候,我恨不得找个地缝钻进去。不过现在Oracle用户们终于可以不再对SQL Server开发者趾高气昂了,因为我们有了“SEQUENCE”对象。 序列号的功能多少有点类似标识列,只是它们没有绑定到特定表,而是绑定到了给定的模式对象。在创……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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 ”做更多普通的类型转换。
该命令基于年月日值返回日期值。例如:
SELECT DATEFROMPARTS (2012,05,1) |
该存储过程返回日期是2012年五月一日。
这个表达式是从Excel中移植过来的,它本质上是创建“CASE”语句的简写方式:
SELECT IIF (1>2,’Impossible’,’Possible’) |
第一部分是待验证条件。第二部分是验证条件为真时返回的表达式;第三部分是验证条件为假时返回的表达式。要注意在“IIF”表达式中你最多只能嵌套十层,同样你也只能嵌套十层“CASE”语句。(坦白地讲,如果你嵌套超过十层,你真的需要重新思考你编写“T-SQL”语句的方式了。)
这是使用一个或多个值创建字符串的快捷方法,所有参数都会被隐式地转换为字符串。
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从1994年到2001年为Windows杂志写作,覆盖了广泛的技术方面。他现在是《The Windows 2000 Power Users Newsletter》一书的出版者,辛勤钻研他擅长的Windows NT, Windows 2000 and Windows XP领域,并为TechTarget写专栏。
翻译
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
数据库和数据仓库的区别在哪儿?
目前,大部分数据仓库还是用数据库进行管理。数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
-
如何使用服务来平衡Oracle RAC 数据库工作负载
为不同的应用程序配置不同的服务,DBA可以更有效地平衡集群工作负载,在Oracle RAC数据库环境下实现更好的应用程序性能。