• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SQL Server2012在开发中的一些新特性
    POST TIME:2021-10-18 18:37

    一、增加了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

    您可能感兴趣的文章:
    • windows server2012无法连接无线网络解决方法(windows无线连接)
    上一篇:如何区分SQL数据库中的主键与外键
    下一篇:sql where 1=1的优缺点分析
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信