SQL Server2012在软件开发中的一些新特性

官方给出了一大堆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

时间: 2024-10-09 06:28:40

SQL Server2012在软件开发中的一些新特性的相关文章

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

在软件开发中,经常性会用到定时任务.这个时候你可能会想到线程.但是事实中,线程方法比较麻烦.容易出错,资源竞争等问题,设计起来让你很头痛. 现在给大家提供一个新的思路,用SQL SERVER 的任务管理器来解决问题. 解决下列问题: 1.商品有购买时间限制.比如定时上线,下线.竞拍结束自动通知用户. 2.数据库中某个数据发生了变化,需要执行一段代码块(这里面的代码并不是存储过程代码,意指c#,JAVA等代码). 3.某个数据发生了变化,需要执行某个动作.(不是立马执行) 针对上面的问题,我们总结

对软件开发中uml建模的理解和图形整理(一)

由于uml(统一建模语言)在开发中经常会用到,特别是在软件开发中的OOAD阶段,因此要理解和使用uml显得尤为重要.在uml开始之前,咱先回顾一个OOAD.OOP的主要特征. OOAD:根据面向对象的方法学来对软件系统进行分析和设计的过程.它包括OOA 分析阶段和OOD设计阶段.其中分析阶段主要解决"What to do?"的问题,而设计阶段主要解决"How to do?"的问题.具体来说就是:在OOA分析阶段咱要做的主要工作就是建立对业务问题域的视图(建立模型).

对于软件开发中开发人员与测试人员关系的理解

在软件开发中都会有开发人员(以下简称开发)和测试人员(以下简称测试),在一些小型公司可能并没有测试,仅仅是开发兼任测试.在这里我仅针对于有专业的测试和专业的开发的项目. 每个公司应该都有考核机制,对于开发和测试的考核实际上很难量化,通常来讲大的方向就是开发所负责模块的bug数,对于测试来讲就是测出来的bug数,但这真的有效吗?这也许对开发有约束力,理论上开发是能够自己控制bug数的,如果从产生的bug数来评判开发的绩效还算有效,这样开发自然就会把代码写得更加认真.但如果根据测试测出来的bug数来

软件开发中几个基本概念

软件开发中几个基本概念 Peixu.Zhu 自己真的深切理解那些经常挂在嘴边的概念么? 抽象 Abstract 抽象的特点是仅存在于思想和理论之中,而非物理或者具体的存在.(不是指C++中的抽象类) 抽象是永存的,不会随着时空而发生变化. 具体 Concrete 具体的特点是物化的或者是具备物理形态,是真实存在的. 具体不是永存的,是随着时空而发生变化的,仅存于具体的时空之中. 具体和抽象的最大区别是是否随着时空而发生变化,即是否存在于我们的四维空间. 实体 Entity 实体是单独的个体事物(

软件开发中,什么是模块化开发?

软件产品可以被看作是由一系列具有特定功能的组件组成,作为一个完整的系统也可以被分解成一系列功能模块,这些模块之间的相互作用就形成了系统的所有功能. 所谓模块是指可组成系统的.具有某种确定独立功能的半自律性的子系统,可以通过标准的界面和其他同样的子系统按照一定的规则相互联系而构成的更加复杂的系统.每个模块的研发和改进都独立于其他模块的研发和改进,每个模块所特有的信息处理过程都被包含在模块的内部,如同一个"黑箱",但是有一个或数个通用的标准界面与系统或其他模块相互连接. 在软件的模块化开发

软件开发中的自测及C代码示例

在软件开发中,程序自测是一个永远都绕不开的话题.很多开发人员以写出有难度的代码为荣,但却不重视对自己编写的代码进行测试,这导致了最终到达客户手中的产品质量不高,bug频发,损害了公司的形象.对于一个开发人员来说,我们应该将开发和自测置于同等重要的地位,我们花在自测上的时间要不比开发少.能否对自己编写的代码进行充分的自测也是检验一个开发人员水平高低的标准之一. 自测方法 根据所编写的程序的特点,自测方法大致有如下几种: 第一种,利用模拟工具进行自测.这种方法适用于需要其他模块(尚不具备)发过来的消

基于git的软件开发中并行工程管理以及版本控制系统概要

并行工程师什么,这里就不再解释(不懂请百度),实际上,在软件开发过程中,涉及到多人合作的以项目小组形式完成开发的软件(这里指广义上)或多或少都使用了并行工程的概念,在正式的项目开发中,项目小组成员总是分工合作每人完成一部分,然后再合并起来,而且,在实际应用中,尽管使用的是瀑布模型完成开发,但总是所有项目小组成员同时开始完成自己的部分,这,其实已经是并行工程了,我们可以自豪的宣布:我们在开发过程中使用了并行 工程这种高大上的玩意来提高开发速度,所以,老板你得给我们涨工资! 很简单吧,看起来好简单的

软件开发中的流程图

在软件开发中必须经历五个阶段,当然这仅是我个人的看法,我只是个初学者,步骤如下: 1.需求分析 2.算法设计极其分析 3.编写代码 4.测试代码 5.软件维护 对于初学者来说,第5步,可以暂时不用管,当然我们的需要任务就是学好第一步,需求分析,有时候一个软件的开发花费的大量时间并不在于编写代码上,而真正花费时间的是第一步,我们软件开发人员开发的软件并不是为了我们,而是为了客户,因此我们要想开发一个成功的软件,了解客户的需求是非常必须的,客户并不是真正的开发人员,他们的要求没有编程人员的想法严密,

软件开发中 常见英文文档 缩写(转)

软件开发中常见英文缩写和各类软件开发文档的英文缩写: 英文简写 文档名称 MRD market requirement document (市场需求文档) PRD product requirement document (产品需求文档) SOW 工作任务说明书 PHB Process Handbook (项目过程手册) EST Estimation Sheet (估计记录) PPL Project Plan (项目计划) CMP Software Management Plan( 配置管理计划