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_STRINGfrom PROJECT p
where SIZE is not null
现在,我们可以简单的写成:
select p.CODE,IIF(p.SIZE>100,'Big','Small') as SIZE_STRINGfrom 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
可
国外的服务器跟国内的服务器 同步有时会冲突,原因很多。如网路 不畅通。没及时更新数据
EXEC distribution..sp_replmonitorhelppublisher
然后加上 飞信短信,就能及时 知道 关键数据不同步情况
本文链接
SQL 关于apply的两种形式cross apply 和 outer apply
apply有两种形式: cross apply 和 outer apply
先看看语法:
<left_table_expression> {cross|outer} apply <right_table_expression>
再让我们了解一下apply运算涉及的两个步骤:
使用apply就像是先计算左输入,让后为左输入中的每一行计算一次右输入。(这一句很重要,可能会不理解,但要先记住,后面会有详细的说明)
最后结合以上两个步骤说明cross apply和outer apply的区别:
cross apply和outer apply 总是包含步骤A1,只有outer apply包含步骤A2,如果cross apply左行应用右表表达式时返回空积,则不返回该行。而outer apply返回改行,并且改行的右表表达式的属性为null。
看到上面的解释或步骤大家可能还是一头的雾水,不知所云。下面用例子来说明:
先建表一([dbo].[Customers] 字段说明:customerid -- 消费者id , city -- 所在城市):
[customerid] [char](5) COLLATE Chinese_PRC_CI_AS NOT NULL,
[city] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
PRIMARY KEY CLUSTERED
(
[customerid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
向表一插入数据:
insert into dbo.Customers values('FRNDO','Madrid');
insert into dbo.Customers values('KRLOS','Madrid');
insert into dbo.Customers values('MRPHS','Zion');
查询所插入的数据:
结果如图:
再建表二([dbo].[Orders] 字段说明:orderid -- 订单id , customerid -- 消费者id):
[orderid] [int] NOT NULL,
[customerid] [char](5) COLLATE Chinese_PRC_CI_AS NULL,
PRIMARY KEY CLUSTERED
(
[orderid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
向表二插入数据:
insert into dbo.Orders values(2,'FRNDO');
insert