多条件查询,显示分页存储过程

存储过程:

它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。
存储过程的优缺点:
优点:
1、执行速度快。
2、减少网络传输。
缺点:
1、不便于调试。
2、办法应用缓存。
1、第一种分页存储过程
第一种是多个表进行连接查询分页

--创建存储过程名
create proc up_PageHouse
@Tid int,			--需要查询的参数
@Rid int,
@Hid int,
@Sid int,
@Location1 varchar(50),
@PageIndex int,		--当前页
@PageSize int,		 --每页显示多少条
@PageCount int out,		--返回总行数
@Count int out					--总页数
as
declare @sql varchar(1000),@sql2 varchar(1000)
set @sql='select  Id,Tname,Rname,Levels,Room,Area,JiArea,Hname,Cname,Location,Locations,Nname,Sname,ROW_NUMBER() over(order by Id) as rid from
 House h inner join Tower t on h.Tid=t.Tid 
 inner join Ridgepole r on  h.Rid=r.Rid 
inner join House_Type ho on h.Hid=ho.Hid 
inner join Construction c on h.Cid=c.Cid 
inner join Nature n on h.Nid=n.Nid 
inner join States s on h.Sid=s.Sid where 1=1'
if(@Tid!=0)
set @sql +='and t.Tname='+cast(@Tid as nvarchar(20))
if(@Rid<>0)
set @sql+='and  r.Rname='+CAST(@Rid as nvarchar(20))
if(@Hid<>0)
set @sql+='and  h.Hname='+CAST(@Hid as nvarchar(20))
if(@Sid<>0)
set @sql+='and  s.Sname='+CAST(@Sid as nvarchar(20))
if(@Location1!='')
set @sql+='and Location like ''%'+@Location1+'%'''
set @sql2='select * from ('+@sql+') as t where rid between '+cast(((@PageIndex-1)*@PageSize+1)as nvarchar(20))+' and '+cast((@PageIndex*@PageSize) as nvarchar(20))
exec (@sql2)
set nocount off
exec (@sql)
set @Count=@@ROWCOUNT
set @PageCount=@Count/@PageSize
 if(@Count%@PageSize>0)
 set @PageCount+=1

 go
--测试代码是否能够查询到分页
  declare @p int ,@w int
exec up_PageHouse 0,0,0,0,'',1,3 ,@p out,@w out
select @p
select @w

2、第二种分页存储过程

create proc FenYe
@PageSize int,---每页显示的条数
@PageIndex int,---当前显示的页
@PageCount int output,---总记录数
@CountPage int output---总页数
as
---计算总记录数
select @PageCount=count(*) from Users
---计算总页数
set @CountPage=@PageCount/@PageSize
if(@PageCount%@PageSize>0)
set @CountPage+=1
---查询结果
select top(@PageSize) * from Users where Id not in (select top((@PageIndex-1)*@PageSize)Id from Users)
go
select * from Users
declare @count int,@page int
exec FenYe 3,2,@count output,@page output
select'总记录数:'+cast(@count as varchar(100))
select'总页数:'+convert(nvarchar(20),@page)

3、第三种分页存储过程

if (object_id('book_page', 'P') is not null)
    
drop proc book_page

go

create proc book_page(
    
@TableName varchar(50),            --表名
    
@ReFieldsStr varchar(200) = '*',   --字段名(全部字段为*)
    
@OrderString varchar(200),         --排序字段(必须!支持多字段不用加order by)
    @WhereString varchar(500) =N'',  --条件语句(不用加where)
    
@PageSize int,                     --每页多少条记录
    
@PageIndex int = 1 ,               --指定当前为第几页
    
@TotalRecord int output            --返回总记录数
)

as

begin
     --处理开始点和结束点
    
Declare @StartRecord int;
    
Declare @EndRecord int; 
    
Declare @TotalCountSql nvarchar(500); 
    
Declare @SqlString nvarchar(2000);    
    
set @StartRecord = (@PageIndex-1)*@PageSize + 1
    
set @EndRecord = @StartRecord + @PageSize - 1 
    
set @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句
    
SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句
    
--
    
IF (@WhereString! = '' or @WhereString!=null)
        
BEGIN
            
SET @TotalCountSql=@TotalCountSql + '  where '+ @WhereString;
            
SET @SqlString =@SqlString+ '  where '+ @WhereString;            
        
END
    --第一次执行得到
    
--
IF(@TotalRecord is null)
    
--  
BEGIN
           
EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数
    
--  
END
    
----执行主语句
    
set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' +  ltrim(str(@EndRecord));
    
Exec(@SqlString)    

END

--调用分页存储过程book_page

exec book_page 'books','*','book_id','',3,1,0;


declare @totalCount int

exec book_page 'books','*','book_id','',3,1,@totalCount output; 

select @totalCount as totalCount;--总记录数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值