SQL 2012 新特性 offset ,fetch next only

今天调试一个表格数据的数据,用的是 EF 作为ORM,遇到了一个奇怪的事情,点击下一页的时候,显示的数据始终不变,我还以为 分页 代码哪里出问题了。检查了半天发现没有问题。

好吧,没办法,将EF 执行的SQL 语句输出,看到了如下代码。

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[TrueName] AS [TrueName], 
    [Extent1].[BirthDay] AS [BirthDay], 
    [Extent1].[Age] AS [Age], 
    [Extent1].[Sex] AS [Sex], 
    [Extent1].[Height] AS [Height], 
    [Extent1].[Photo] AS [Photo], 
    [Extent1].[Adress] AS [Adress], 
    [Extent1].[Telephone] AS [Telephone], 
    [Extent1].[Mobilephone] AS [Mobilephone], 
    [Extent1].[WeChat] AS [WeChat], 
    [Extent1].[Qq] AS [Qq], 
    [Extent1].[Email] AS [Email], 
    [Extent1].[AddTime] AS [AddTime], 
    [Extent1].[UpTime] AS [UpTime]
    FROM [dbo].[Members] AS [Extent1]
    ORDER BY [Extent1].[AddTime] Desc
    OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY 

注意看最后的一行 OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY 。先声明:本地电脑安装的是SQL2012 。第一眼,好像之前的分页写法不是这样。难道是 SQL2012 的新特性?的确是!!

看字面意思,offset 0 row 意思就是 跳过/偏移 0 行,fetch next 5 rows only 意思就是 接收/取出 接下来的5行数据。 有点 linq 语法的味道。[list].skip(n).take(n);

接下来说下上面查询后没有分页的问题。

先看我们的数据。

QQ截图20150118120959

时间这一列值是一样的。

上面的SQL 语句我们简化下。

select 
Id,TrueName,AddTime
from  Members 
order by AddTime desc 
offset 0 rows fetch next 5 rows only

看下查询结果:

QQ截图20150118121357

再查:

select 
Id,TrueName,AddTime
from  Members 
order by AddTime desc 
offset 5 rows fetch next 5 rows only

QQ截图20150118121456

再查:

select 
Id,TrueName,AddTime
from  Members 
order by AddTime desc 
offset 15 rows fetch next 5 rows only

QQ截图20150118121530

。。。。。。

呵呵,TM 居然一样! 这是什么情况? 我怎么觉得 在哪里遇到过类似的问题,在access数据库中 查询指定数量,排序的字段值是一样的情况下,查询出来的结果行数 不一定 正确! 这个问题好像是access的已知BUG,但微软貌似不会去修复了,解决方法就是 多加一个值不会相同排序字段,比如自增长列字段。

好了,也用这个方法来试试!

QQ截图20150118122222 

呵呵。。。这算BUG吗??

找万能的GOOGLE 去看看这是神马情况。。。

。。。。。。

好吧,我表示没有找到这是为什么。。。 留待以后解决。。。

已禁用评论。