官方给出了一大堆SQL2012相对于SQL2008R2的新特性,但是大多数对于普通开发人员来说都是浮云,根本用不到,下面就说说一些对于开发人员来说比较有用的新特性。
 
一、在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在软件开发中的一些新特性的更多相关文章

  1. 软件开发中 SQL SERVER 任务的用法

    在软件开发中,经常性会用到定时任务.这个时候你可能会想到线程.但是事实中,线程方法比较麻烦.容易出错,资源竞争等问题,设计起来让你很头痛. 现在给大家提供一个新的思路,用SQL SERVER 的任务管 ...

  2. Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义

    Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义 首先我们指明,任何一种行动以及教派修行方法都有他的多元化,只看到某一方面,就不能很好的评估利弊,适不适合自己使 ...

  3. 软件开发中的完整测试所包括的环节UT、IT、ST、UAT

    软件开发中的完成测试环境所包括的环节包括:UT.IT.ST.UAT UT = Unit Test 单元测试 IT = System Integration Test 集成测试ST = System T ...

  4. 关于软件开发中兼容win7注册表的解决方案

    关于软件开发中兼容win7注册表的解决方案   编写人:CC阿爸 2014-3-14 l  近来在开发一winform程序时,发现在xp 系统访问注册表一切正常.可偏这个时候,微软又提醒大家.Xp今年 ...

  5. Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向

    Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主    过程导向 vs 结果导向 1. 一个伟大的事业必然是过程导向为主 1 1.1. 过程的执行情况(有明确的执行手册及标准) ...

  6. UML在软件开发中各个阶段的作用和意义

    经典的软件工程思想将软件开发分成5个阶段:需求分析,系统分析与设计,系统实现,测试及维护五个阶段. 之所以如此,是因为软件开发中饣含了物和人的因素,存在着很大的不确定性,这使得软件工程不可能像理想的, ...

  7. Java软件开发中迭代的含义

    软件开发中,各个开发阶段不是顺序执行的,而各个阶段都进行迭代并行执行的,然后在进入下一个阶段的开发. 这样对于开发中的需求变化,及人员变动都能得到更好的适应. 软件开发过程汇总迭代模型如下图所示:

  8. 软件开发中oracle查询常用方法总结

    上次新霸哥和大家讲解了一些关于oracle的知识发现大家对oracle还是比较感兴趣的,下面新霸哥就大家比较关系的oracle中常用的查询有哪几种?做个和oracle相关的开发的朋友可能会知道答案,但 ...

  9. Xcode中StoryBoard Reference 新特性的使用

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

随机推荐

  1. ajax 传递数组类型参数后台接收不到的问题

    在做排序功能的时候需要将一个数组的数据传递到后台,(当时怎么没用json,如果用json就没有那么多的事情了),数据提交采用ajax! 先看代码 js: submitbtn: function () ...

  2. 【BZOJ4627】[BeiJing2016]回转寿司 SBT

    [BZOJ4627][BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿司带给小Z的味觉感 ...

  3. activeMQ安装与测试

    Apache ActiveMQ简介 activeMQ是JMS的一种具体的实现,是最流行的,能力强劲的开源消息总线.activeMQ具有以下优势: 多种语言和协议编写客户端(java.C.C++.AJA ...

  4. Leetcode-Permuation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  5. [hihoCoder] Trie树

    This is a application of the Trie data structure, with minor extension. The critical part in this pr ...

  6. 基于minikube的kubernetes集群部署及Vitess最佳实践

    简介 minikube是一个可以很容易在本地运行Kubernetes集群的工具, minikube在电脑上的虚拟机内运行单节点Kubernetes集群,可以很方便的供Kubernetes日常开发使用: ...

  7. Converts Internet addresses to Internet numbers. ip2long long2ip

    http://php.net/manual/en/function.long2ip.phpPHP: ip2long - Manual http://php.net/manual/en/function ...

  8. T-SQL with关键字 with as 递归循环表

    )SET @OrgId = N'901205CA-6C22-4EE7-AE4B-96CC7165D07F'; WITH Childs AS ( SELECT * FROM HROrgRelation ...

  9. 2015-03-12——简析DOM2级事件

    DOM2级事件 事件的几种类型:对象事件,鼠标事件,键盘事件,表单事件,W3CDOM事件,以及针对浏览器的事件. 对象事件:window对象,也是javascript对象.load  适用于windo ...

  10. python2 打印菱形

    程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列. 程序源代码: #!/usr/bin/python # -*- coding: UT ...