数据库教程:SQL Server2012在开发中的一些新特性

一、增加了sequence对象。这个对于oracle用户来说是最熟悉不过的数据库对象了,现在在sql server中终于也看到了类似的对象,只是在使用的语法上有一点点不一样

一、增加了sequence对象。
这个对于oracle用户来说是最熟悉不过的数据库对象了,现在在sql server中终于也看到了类似的对象,只是在使用的语法上有一点点不一样。创建语法也是create sequence,使用的时候需要使用next value for来取下一个值:

复制代码 代码如下:
create sequence [dbo].[sq_1]
 as [bigint]
 start with 1
 increment by 1;

select next value for [sq_1] as firstuse;

如果要插入一个值,那么就是:

复制代码 代码如下:
insert into t1(c1,c2)
values (next value for sq_1, ‘test’) ;

但是好像没有提供获得当前值的语法,难道必须取下一个值?

二、新的分页查询语法。
以前在sql server中分页,最早是用top或者临时表,后来出现了row_number函数实现分页,现在最新的sql2012可以在order by子句后跟offset和fetch来分页,感觉有点像是linq的语法。比如查询1w行之后的20条有效项目信息,那么row_number分页查询的sql是:

复制代码 代码如下:
select  *
from
(
select *,row_number() over(order by p.project_id) r
from project p
where p.is_deleted=0
) x
where x.r  between 10001 and 10020而是有了新的语法,那么查询语句就是:

select *
from project p
where p.is_deleted=0
order by p.project_id
offset 10001 rows
fetch next 20 rows only;

显然使用了新的语法后代码看起来更简洁,意思表达也更明确。从执行效率上来讲,试了一下,是一样的。

三、一些新的系统函数。
3.1相当于c#中三目运算符的iif函数

这个函数和vba中的iif函数相同,判断第一个参数的表达式是否为真,真则返回第二个参数,假则返回第三个参数。

有了这个函数很多时候我们可以不用再使用复杂的case when语法了。比如我们判断项目的大小以显示对应的字符串,那么老的写法是:

复制代码 代码如下:
select p.code,case when p.size>100 then ‘big’ else ‘small’ end as size_string
from project p
where size is not null

现在,我们可以简单的写成:

复制代码 代码如下:
select p.code,iif(p.size>100,’big’,’small’) as size_string
from project p
where size is not null

3.2不用判断类型和null的字符串连接concat函数

sql server本来对字符串的连接很简单,直接使用“+”号,但是需要注意两个问题,一是必须类型都是字符串类型,如果是数字类型那么会报语法错误,所以必须把数字类型转换为字符串。二是如果其中的某个值为null,那么整个连接的结果就是一个null字符串,所以还需要判断null,所以本来只是一个连接字符串的查询就会写的很复杂:

复制代码 代码如下:
select p.project_id, p.code+’,’+p.name+’,’+isnull(p.nick_name,”)+’,’+isnull(convert(varchar(50),p.size),”)
from project p

现在使用concat函数,直接忽略其中的类型,忽略对null的检查,直接连接成一个非空的字符串:

复制代码 代码如下:
select p.project_id,concat( p.code,’,’,p.name,’,’,p.nick_name,’,’,p.size)
from project p

可以明显感觉到简洁了很多。

3.3转换成字符串时设置格式的format函数。

以前要把数字或者日期转换成字符串,可以使用convert函数并带人第三个整数类型的参数指定转换的格式,不过这种方法太麻烦,整数参数不容易理解和记忆,而且也不灵活。现在的format函数相当于c#中的string.format函数,在第二个参数中可以想要输出的格式。

复制代码 代码如下:
select p.project_id,format(p.created_time,’yyyy-mm-dd’),convert(varchar(50),p.created_time,112)
from project p

3.4让枚举显示更方便的choose函数。

在程序中经常使用枚举值,在数据库中使用tinyint来保存枚举值,但是在查看时却不是很容易理解枚举值的含义,必须查看代码看1对应什么,2对应什么才知道。在显示的时候如果要显示成字符串,那么就需要使用case when进行判断。现在可以使用choose函数,让枚举转换成字符串变得很简单。比如要显示项目的状态,那么我们的查询就是:

复制代码 代码如下:
select p.code,choose( p.status,’plan’,’exec’,’complete’,’abort’,’fail’)
from project p

chosse函数比case when有几个缺点,1是不支持0和负数,所以如果枚举的值是0那么就没办法显示,2是枚举值必须连续而且比较小,不能使用100、200等值,那要是用choose那得写死人了。没有default值,使用case when的时候,如果不匹配还有个else值可以显示,而使用choose后如果没有匹配的,那么就是null值。所以个人觉得这个函数的使用面非常

3.5各种日期时间函数。

除了一个eomonth函数是返回给定日期的最后一天外,其他的新函数,都是把年月日作为参数传进去,返回指定数据类型的对象,相当于就是convert函数的变形。总体使用不多,在此不多介绍。

四、over子句的增强和新增一些分析函数。
之前over子句是用于rank,row_number等排名函数,现在over子句得到了大大的增强, 可以将over子句应用到聚合函数中,也增加了一些分析函数。

比如我有一个项目和客户表,一个客户对于多个项目,现在需要知道客户的信息和每个客户的最新项目code,这个要是以前还不好实现,现在我们有了分析函数,可以使用first_value或者last_value再配合over子句,得到我们想要的结果:

复制代码 代码如下:
select distinct c.*,first_value(p.code) over(partition by c.client_id order by p.[created_time] desc) as last_project_code
from project p
inner join client c
on p.client_id=c.client_id

需要了解更多数据库技术:SQL Server2012在开发中的一些新特性,都可以关注数据库技术分享栏目—计算机技术网(www.ctvol.com)!

www.ctvol.com true Article 数据库教程:SQL Server2012在开发中的一些新特性

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/616776.html

(0)
上一篇 2021年5月20日 下午4:50
下一篇 2021年5月20日 下午4:51

精彩推荐