通过网上的资料和自己整理出来,总结的分页方法 。
每页2条数据,查询第三页。
1、 SELECT TOP 2 * FROM [Travel].[dbo].[ScenicHotel] WHERE ID NOT IN (SELECT TOP 4 ID FROM [Travel].[dbo].[ScenicHotel])
2、 SELECT TOP 2 * FROM [Travel].[dbo].[ScenicHotel] WHERE (
ID>
(SELECT MIN(ID) FROM [Travel].[dbo].[ScenicHotel] WHERE ID>4 )
)
前两种运用子查询,前提需要保证ID连续。所以一般设计多表查询或者大数据时就不怎么好用。就当是一种了解。
3、
之前写的一个分页存储过程,使用sp_executesql 扩展存储过程。其中会生成临时表。
--执行带输出参数的动态SQL,返回总行数,总页数
create proc SSS
@type varchar(50),
@sql varchar(500),
@pageCount int,@pageIndex int, --一页几条,第几页
@Count int output,@Index int output --总条数,总页数
as
declare @s varchar(max)
declare @newS varchar(max)
declare @getCount nvarchar(max)
if @type='Audition'
begin
set @s='(select*from Audition '+@sql+' )as a ' --查询出的新表
--执行动态SQL,查询所查页的信息
set @newS='select top '+CONVERT(varchar,@pageCount)+' * from '+@s +' where AuditionID not in
(select top '+CONVERT(varchar,( @pageCount*(@pageIndex-1)))+' AuditionID from '+@s +' order by InterviewDate desc)order by InterviewDate desc'
exec (@newS)
set @getCount='select @Count= COUNT(*) from '+ @s+' select @Index=CEILING( COUNT(*)/CONVERT(float,'+CONVERT(varchar, @pageCount)+')) from '+@s
exec sp_executesql @getCount,N'@Count int output,@Index int output',@Count output,@Index output
end
else
begin
set @s='(select*from Resume '+@sql+' )as a ' --查询出的新表
--执行动态SQL,查询所查页的信息
set @newS='select top '+CONVERT(varchar,@pageCount)+' * from '+@s +' where ResumeID not in
(select top '+CONVERT(varchar,( @pageCount*(@pageIndex-1)))+' ResumeID from '+@s +' order by TimeOfSubmitResume desc )order by TimeOfSubmitResume desc'
exec (@newS)
set @getCount='select @Count= COUNT(*) from '+ @s+' select @Index=CEILING( COUNT(*)/CONVERT(float,'+CONVERT(varchar, @pageCount)+')) from '+@s
exec sp_executesql @getCount,N'@Count int output,@Index int output',@Count output,@Index output
end
go
declare @C int,@I int
exec SSS '[Resume]',' where Nation=''汉族'' ',3,2,@C output,@I output
print @C
print @I
4、
使用临时表,临时表中有两个字段,一个是自增长ID,一个是符合条件的CID。然后进行表连接,查询第几页数据就可以了,现在貌似已经不常用临时表了。
DECLARE @tab TABLE
(
ID INT PRIMARY KEY IDENTITY(1,1),
CID int
)
INSERT INTO @tab
( CID )
SELECT ID FROM [Travel].[dbo].[ScenicHotel] WHERE 1=1
SELECT COUNT(*)FROM @tab
SELECT TOP 2 * FROM [Travel].[dbo].[ScenicHotel] sh LEFT JOIN @tab t ON t.CID=sh.ID WHERE t.ID>4
5、
ROW_NUMBER() OVER 。现在的主流分页方式它是SQL中的一个内置函数,作用和临时表中的自增长ID一样。
再加上一般情况下用户只会使用点击前几页数据,所以性能是最好的。(推荐使用)
SELECT COUNT(1) FROM [Travel].[dbo].[ScenicHotel] WHERE 1=1 --总条数
SELECT * FROM
(SELECT ROW_NUMBER() OVER( ORDER BY ID)AS RNum,ID,Comments FROM [Travel].[dbo].[ScenicHotel] )T
WHERE T.RNum>4