欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

三种SQL分页查询的存储过程代码

程序员文章站 2023-12-04 12:19:10
复制代码 代码如下: --根据max(min)id create proc [dbo].[proc_select_id] @pageindex int=1,--当前页数 @...
复制代码 代码如下:

--根据max(min)id
create proc [dbo].[proc_select_id]
@pageindex int=1,--当前页数
@pagesize int=10,--每页大小
@tablename varchar(50)='',--表名
@fields varchar(1000)='',--查询的字段集合
@keyid varchar(50)='',--主键
@condition nvarchar(1000)='',--查询条件
@orderstr varchar(500),--排序条件
@totalrecord bigint output--总记录数
as
if isnull(@orderstr,n'')=n'' set @orderstr=n' order by '+@keyid+n' desc '
if isnull(@fields,n'')=n'' set @fields=n'*'
if isnull(@condition,n'')=n'' set @condition=n'1=1'
declare @sql nvarchar(4000)
--if(@totalrecord is null)
--begin
set @sql=n'select @totalrecord=count(*)'
+n' from '+@tablename
+n' where '+@condition
exec sp_executesql @sql,n'@totalrecord int output',@totalrecord output
--end
if(@pageindex=1)
begin
set @sql=n'select top '+str(@pagesize)+n' '+@fields+n' from '+@tablename+n' where '+@condition+n' '+@orderstr
exec(@sql)
end
else
begin
declare @operatestr char(3),@comparestr char(1)
set @operatestr='max'
set @comparestr='>'
if(@orderstr<>'')
begin
if(charindex('desc',lower(@orderstr))<>0)
begin
set @operatestr='min'
set @comparestr='<'
end
end
set @sql=n'select top '+str(@pagesize)+n' '+@fields+n' from '+@tablename+n' where '+@keyid+@comparestr
+n'(select '+@operatestr+n'('+@keyid+n') from '+@tablename+n' where '+@keyid
+n' in (select top '+str((@pageindex-1)*@pagesize)+n' '+@keyid+n' from '+@tablename+n' where '
+@condition+n' '+@orderstr+n')) and '+@condition+n' '+@orderstr
exec(@sql)
end
go


--根据row_number() over
create proc [dbo].[proc_select_page_row]
@pageindex int=1,--当前页数
@pagesize int=10,--每页大小
@tablename varchar(50)='',--表名
@fields varchar(1000)='*',--查询的字段集合
@keyid varchar(50)='',--主键
@condition nvarchar(1000)='',--查询条件
@orderstr varchar(500),--排序条件
@totalrecord bigint output--总记录数
as
if isnull(@orderstr,n'')=n'' set @orderstr=n' order by '+@keyid+n' desc '
if isnull(@fields,n'')=n'' set @fields=n'*'
if isnull(@condition,n'')=n'' set @condition=n'1=1'
declare @sql nvarchar(4000)
-- if @totalrecord is null
-- begin
set @sql=n'select @totalrecord=count(*)'
+n' from '+@tablename
+n' where '+@condition
exec sp_executesql @sql,n'@totalrecord bigint output',@totalrecord output
--end
if(@pageindex=1)
begin
set @sql=n'select top '+str(@pagesize)+n' '+@fields+n' from '+@tablename+n' where '+@condition+n' '+@orderstr
exec(@sql)
end
else
begin
declare @startrecord int
set @startrecord = (@pageindex-1)*@pagesize + 1
set @sql=n'select * from (select row_number() over ('+ @orderstr +n') as rowid,'+@fields+n' from '+ @tablename+n') as t where rowid>='+str(@startrecord)+n' and rowid<='+str(@startrecord + @pagesize - 1)
exec(@sql)
end
go


--根据top id
create proc [dbo].[proc_select_page_top]
@pageindex int=1,--当前页数
@pagesize int=10,--每页大小
@tablename varchar(50)='',--表名
@fields varchar(1000)='',--查询的字段集合
@keyid varchar(50)='',--主键
@condition nvarchar(1000)='',--查询条件
@orderstr varchar(500),--排序条件
@totalrecord bigint output--总记录数
as
if isnull(@orderstr,n'')=n'' set @orderstr=n' order by '+@keyid+n' desc '
if isnull(@fields,n'')=n'' set @fields=n'*'
if isnull(@condition,n'')=n'' set @condition=n'1=1'
declare @sql nvarchar(4000)
--if(@totalrecord is null)
--begin
set @sql=n'select @totalrecord=count(*)'
+n' from '+@tablename
+n' where '+@condition
exec sp_executesql @sql,n'@totalrecord int output',@totalrecord output
--end
if(@pageindex=1)
begin
set @sql=n'select top '+str(@pagesize)+n' '+@fields+n' from '+@tablename+n' where '+@condition+n' '+@orderstr
exec(@sql)
end
else
begin
set @sql=n'select top '+str(@pagesize)+n' '+@fields+n' from '+@tablename+n' where '+@keyid
+n' not in(select top '+str((@pageindex-1)*@pagesize)+n' '+@keyid+n' from '
+@tablename+n' where '+@condition+n' '+@orderstr+n') and '+@condition+n' '+@orderstr
exec(@sql)
end
go