SQL Server 已经发布一段时间了最近在新的机器上安装了最新的SQL Server SP体检下感觉良好官方给出了一大堆SQL相对于SQLR的新特性但是大多数对于普通开发人员来说都是浮云根本用不到下面就说说一些对于开发人员来说比较有用的新特性
一增加了Sequence对象
这个对于Oracle用户来说是最熟悉不过的数据库对象了现在在SQL Server中终于也看到了类似的对象只是在使用的语法上有一点点不一样创建语法也是CREATE SEQUENCE使用的时候需要使用NEXT VALUE FOR来取下一个值
CREATE SEQUENCE [dbo][SQ_]
AS [bigint]
START WITH
INCREMENT BY ;
SELECT NEXT VALUE FOR [SQ_] AS FirstUse;
如果要插入一个值那么就是
INSERT INTO t(cc)
VALUES (NEXT VALUE FOR SQ_ Test) ;
但是好像没有提供获得当前值的语法难道必须取下一个值?
二新的分页查询语法
以前在SQL Server中分页最早是用top或者临时表后来出现了ROW_NUMBER函数实现分页现在最新的SQL可以在order by子句后跟offset和fetch来分页感觉有点像是LINQ的语法比如查询W行之后的条有效项目信息那么ROW_NUMBER分页查询的SQL是
select *
from
(
select *ROW_NUMBER() over(order by pPROJECT_ID) R
from PROJECT p
where pIS_DELETED=
) x
where xR between and
而是有了新的语法那么查询语句就是
SELECT *
FROM PROJECT p
where pIS_DELETED=
ORDER BY pPROJECT_ID
OFFSET ROWS
FETCH NEXT ROWS ONLY;
显然使用了新的语法后代码看起来更简洁意思表达也更明确从执行效率上来讲试了一下是一样的
三一些新的系统函数
相当于C#中三目运算符的IIF函数
这个函数和VBA中的IIF函数相同判断第一个参数的表达式是否为真真则返回第二个参数假则返回第三个参数
有了这个函数很多时候我们可以不用再使用复杂的case when语法了比如我们判断项目的大小以显示对应的字符串那么老的写法是
select pCODEcase when pSIZE> then Big else Small end as SIZE_STRING
from PROJECT p
where SIZE is not null
现在我们可以简单的写成
select pCODEIIF(pSIZE>BigSmall) as SIZE_STRING
from PROJECT p
where SIZE is not null
不用判断类型和NULL的字符串连接CONCAT函数
SQL Server本来对字符串的连接很简单直接使用“+”号但是需要注意两个问题一是必须类型都是字符串类型如果是数字类型那么会报语法错误所以必须把数字类型转换为字符串二是如果其中的某个值为null那么整个连接的结果就是一个null字符串所以还需要判断null所以本来只是一个连接字符串的查询就会写的很复杂
select pPROJECT_ID pCODE++pNAME++ISNULL(pNICK_NAME)++ISNULL(CONVERT(varchar()pSIZE))
from PROJECT p
现在使用CONCAT函数直接忽略其中的类型忽略对NULL的检查直接连接成一个非空的字符串
select pPROJECT_IDCONCAT( pCODEpNAMEpNICK_NAMEpSIZE)
from PROJECT p
可以明显感觉到简洁了很多
转换成字符串时设置格式的FORMAT函数
以前要把数字或者日期转换成字符串可以使用CONVERT函数并带人第三个整数类型的参数指定转换的格式不过这种方法太麻烦整数参数不容易理解和记忆而且也不灵活现在的FORMAT函数相当于C#中的StringFormat函数在第二个参数中可以想要输出的格式
select pPROJECT_IDFORMAT(pCREATED_TIMEyyyyMMdd)CONVERT(varchar()pCREATED_TIME)
from PROJECT p
让枚举显示更方便的CHOOSE函数
在程序中经常使用枚举值在数据库中使用tinyint来保存枚举值但是在查看时却不是很容易理解枚举值的含义必须查看代码看对应什么对应什么才知道在显示的时候如果要显示成字符串那么就需要使用case when进行判断现在可以使用CHOOSE函数让枚举转换成字符串变得很简单比如要显示项目的状态那么我们的查询就是
select pCODECHOOSE( pSTATUSPlanExecCompleteAbortFail)
from PROJECT p
CHOSSE函数比case when有几个缺点是不支持和负数所以如果枚举的值是那么就没办法显示是枚举值必须连续而且比较小不能使用等值那要是用CHOOSE那得写死人了没有default值使用case when的时候如果不匹配还有个else值可以显示而使用CHOOSE后如果没有匹配的那么就是NULL值所以个人觉得这个函数的使用面非常
各种日期时间函数
除了一个EOMONTH函数是返回给定日期的最后一天外其他的新函数都是把年月日作为参数传进去返回指定数据类型的对象相当于就是CONVERT函数的变形总体使用不多在此不多介绍
四OVER子句的增强和新增一些分析函数
之前OVER子句是用于RANKROW_NUMBER等排名函数现在OVER子句得到了大大的增强 可以将OVER子句应用到聚合函数中也增加了一些分析函数
比如我有一个项目和客户表一个客户对于多个项目现在需要知道客户的信息和每个客户的最新项目Code这个要是以前还不好实现现在我们有了分析函数可以使用FIRST_VALUE或者LAST_VALUE再配合OVER子句得到我们想要的结果
select distinct c*FIRST_VALUE(pCODE) over(PARTITION BY cCLIENT_ID order by p[CREATED_TIME] desc) as LAST_PROJECT_CODE
from PROJECT p
inner join CLIENT c
on pCLIENT_ID=cCLIENT_ID