SQL Server 2012已经发布一段时间了,最近在新的机器上安装了最新的SQL Server 2012 SP1,体检下感觉良好。官方给出了一大堆SQL2012相对于SQL2008R2的新特性,但是大多数对于普通开发人员来说都是浮云,根本用不到,下面就说说一些对于开发人员来说比较有用的新特性。

一、增加了Sequence对象。

这个对于Oracle用户来说是最熟悉不过的数据库对象了,现在在SQL Server中终于也看到了类似的对象,只是在使用的语法上有一点点不一样。创建语法也是CREATE SEQUENCE,使用的时候需要使用NEXT VALUE FOR来取下一个值:

CREATE SEQUENCE [dbo].[SQ_1] AS [bigint]START WITH 1INCREMENT 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

【出自博客园深蓝居,转载请注明作者出处】

转载于:https://www.cnblogs.com/suther/archive/2013/04/02/2994845.html

SQL Server2012在程序开发中实用的一些新特性相关推荐

  1. 程序开发中的软实力和硬实力

    概述:实力是一种客观存在,而霸权不同,霸权的基础虽然是实力,但它更是一种感知,是其他国家对他实力的感知. 一个大国,当然要积累实力,但重要的是通过战略运作,来经营国际社会对你霸权的感知.这个区别有意思 ...

  2. 项目的命名规范,为以后的程序开发中养成良好的行为习惯

    代码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯. 代码编写规范使用范围:J2EE项目开发. 一.包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 1.s ...

  3. 关于微信小程序开发中遇到的缺少game.json问题的解决

    关于微信小程序开发中遇到的缺少game.json问题的解决 参考文章: (1)关于微信小程序开发中遇到的缺少game.json问题的解决 (2)https://www.cnblogs.com/ygxd ...

  4. 用vscode编写静态页面_开发中实用的VSCode插件推荐

    本篇文章给大家介绍一下开发中实用的VSCode插件推荐.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 工欲善其事必先利其器,以下是本人为前端开发收集的vscode插件,有需要的话赶 ...

  5. DevOps 在移动应用程序开发中扮演什么角色?

    作者 | VARUN BHAGAT 译者 | 火火酱,责编| Carol 封图 | CSDN 付费下载自视觉中国 全球智能手机用户数量已经超过30亿.据估计,未来几年用户人数将增加至数亿人.智能手机用 ...

  6. 解决微信小程序开发中wxss中不能用本地图片

    微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...

  7. 程序开发中 status 还是 state

    对比: 程序开发中,两个都解释为状态: status表示关联状态的转变,例如[账户]的正常.冻结.删除: state表示非关联状态的转变,例如[枚举]: 参考: 程序代码中,怎么区分status和st ...

  8. 实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie

    实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie 1-使用npm install axios;命令安装axios 2-新建一个文件夹再建一个.js后缀文件 ...

  9. java写微信小程序答辩问题_微信小程序 开发中遇到问题总结

    微信小程序 开发中遇到问题总结 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app.js的全局数据时,无法按顺序加载.例: //app.js App({ ...

最新文章

  1. Blender创建三维教室场景学习教程 3D Classroom Environment Creation in Blender
  2. 【GAN的应用】基于对抗学习的图像美学增强方法
  3. zookeeper 都有哪些使用场景?
  4. SpringBoot2.x RabbitMQ Nacos Nacos-Config
  5. Linux 常用命令整理
  6. 输入一个以回车结束的字符串,判断该字符串是否对称(正序与逆序相同,如aBc2cBa为对称字符串)
  7. python网络爬虫的学习
  8. 提前祝各位:圣诞节快乐~
  9. 【java】中缀表达式转后缀表达式 java实现
  10. Teststand-并行测试模型设置步骤
  11. 打印机驱动开发,初步了解
  12. 【虚拟主机】服务器搭建
  13. python去重算法_python去重算法
  14. antd中如何实现分页勾选记住之前的选项
  15. LTD营销SaaS-官微云代理商加盟服务
  16. 新概念英语1册57课
  17. Linux运维基本功(贰)---Linux系统的目录结构
  18. 基于JSP的在线学习网站的设计与实现
  19. status 401 reading SysUserService#login(Stri
  20. go xorm 最简操作

热门文章

  1. 关于资产和负债的理解
  2. webpack4 搭建 Vue 开发环境笔记
  3. wvr450g设置虚拟服务器,TP-Link TL-WVR450G V3 无线路由器一对一NAT映射设置方法
  4. 毕业季基于spring的基于安卓APP的基于ssm框架的基于微信小程序的管理系统设计与开发(开题+源码+讲解+论文)
  5. Stata:非对称固定效应模型
  6. GoogLeNet:《Going deeper with convolutions》论文详解
  7. 假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法。
  8. Mvc请求的生命周期
  9. Java学习笔记———选择结构
  10. Redis集群--Cluster--故障转移的过程(原理)