Heim >Datenbank >MySQL-Tutorial >SQL Server2012对于开发人员用的上的新特性

SQL Server2012对于开发人员用的上的新特性

WBOY
WBOYOriginal
2016-06-07 16:18:281056Durchsuche

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

   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 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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn