分页原理:
SELECT TOP 页大小 *
FROM 表
WHERE A=xx and (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表 where A=xx
ORDER BY id))
ORDER BY ID
复杂的分页逻辑,需要自己编写,并没有通用的分页存储过程。以下仅是一般常常使用的分页存储过程:
--create by 阿猫 2018-12-18
create PROCEDURE [dbo].[SP_Paper]
@TableNames VARCHAR(8000), --表名
@PrimaryKey VARCHAR(8000), --主键
@Fields VARCHAR(8000), --要取出的字段
@PageSize INT, --每页记录数
@CurrentPage INT, --当前页,0表示第1页
@Filter VARCHAR(8000) = '', --条件,可以为空
@Order VARCHAR(8000) = '', --排序,可以为空
@RecordCount int --0只返回当前页数据,1返回总数并返回当前页数据
AS
BEGIN
DECLARE @strSQL VARCHAR(8000);
DECLARE @where1 VARCHAR(8000);
DECLARE @where2 VARCHAR(8000);
DECLARE @recordNum VARCHAR(8000);
if @Filter!=''
begin
set @where1=@Filter+' and ';
set @where2=' where '+@Filter;
end
set @strSQL='declare @PageRecordNumber int;'
IF @Filter = ''
begin
set @strSQL =@strSQL+ 'select @PageRecordNumber=count(*) from ' + @TableNames+';';
end
else
begin
set @strSQL = @strSQL+'select @PageRecordNumber=count(*) from ' + @TableNames + @where2+';';
end
if @RecordCount=0
begin
set @strSQL='';
end
else
begin
set @recordNum=',@PageRecordNumber as Page_RecordNumber'
end
set @strSQL=@strSQL+'select top '+convert(nvarchar(100),@PageSize)+' '+@Fields+@recordNum+'
FROM '+@TableNames+'
WHERE '+@where1+'('+@PrimaryKey+' NOT IN
(SELECT TOP '+convert(nvarchar(100),@PageSize*@CurrentPage)+' '+@PrimaryKey+'
FROM '+@TableNames+@where2+'
ORDER BY '+@Order+'))
ORDER BY '+@Order;
exec (@strSQL);
END