存储过程:
它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。
存储过程的优缺点:
优点:
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;--总记录数。