有两种写法,内容在SQL Server 2005下测试通过
基础表信息:
CREATE TABLE [dbo].[Student](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[Age] [int] NULL,
[RegisterTime] [datetime] NULL,
CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
方法1):
declare @pageNum int
declare @pageSize int
set @pageNum = 2
set @pageSize = 10
select Top (@pageSize) * from Student where ID not in (select top (@pageSize* (@pageNum -1)) ID from Student order by ID) order by ID
方法2)
declare @pageNum int
declare @pageSize int
set @pageNum = 2
set @pageSize = 10
select * from
(select top(@pageSize) *
from (select top (@pageSize* @pageNum) * from Student order by ID) T1
order by T1.ID desc) T2
order by T2.ID
方法1)的思路是先排序后取出前PageNum-1页的数据,然后再取得不包含其中的哪些数据,排序后取得前PageSize的数据
方法2)的思路是正向排序后,先取得前PageSize *PageNum页的数据,然后再逆向排序后,取得前PageSize的数据,然后再正向排序。
语法注意点:
1)Sqlserver中使用TOP N是,如果N是一个常数,如 TOP 10 ,则可以不用加括号。 否则,如果是一个 表达式 如 TOP (10*2) 或者 TOP(@PageSize*@PageNum) 则 必须加括号,否则编译不通过
2)多级嵌套时,必须为临时表创建一个别名,因为order by ID 这时候是认不出来的,必须要加上别名前缀。 参照方法二中的写法