呵呵..又来写文章了,我们的经理飞飞同学说的,要经常写博客,把自己学到的东西都总结起来,便于以后查阅.
这不是.今天开发新闻系统的数据库,飞飞同学说对新闻的查询要用存储过程分页显示...可是....我不会吖````5555555555.木的办法...就请教了...然后就学习了下一个简单的存储过程分页.自我感觉基本的框架就是那样的,
可能用起来要灵活变通下,这个分页存储过程不是很通用的.废话不多说咯,把今天刚学的存储过程分页发上来大家分享下. 存储过程如下:
ALTER
PROCEDURE
dbo.PageList
@index int , -- 当前页号,从0开始编号,所以如果该参数是1的话代表的是第二页
@pagesize int , -- 每页数据条数
@contation nvarchar ( 1000 ) -- 判断条件,就是where后面的东东
AS
declare @count int -- 符合查询结果的数据条数
declare @startID varchar ( 20 ) -- 当前页中记录的开始ID,每张表都有自己的主键ID,每条记录都有自己唯一的ID
declare @rowcount int -- 下面会用到set rowcount @rowcount,就是取top @rowcount条记录
declare @maxpage int -- 总页数
declare @temp nvarchar ( 2000 ) -- select语句字符串
SET NOCOUNT ON
if ( LEN ( @contation ) > 0 ) -- 不输入查询条件则默认全部查询,如果输入了查询条件,则LEN(@contation)>0,然后在查询条件最开头加一个 and,即where 1=1 and (查询条件.....)
set @contation = ' and ' + @contation
-- select @count=count(*) from [dptInfo] where 1=1
select @temp = ' select @count=count(*) from [dptInfo] where 1=1 ' + @contation
execute sp_executesql -- 执行查询
@temp ,
N ' @count int output ' ,
@count output -- 返回@count
set @maxpage = ( @count + @pagesize - 1 ) / @pagesize -- 计算总页数,这个是分页计算总页数的公式哦,这个算术表达式一定要这样写,否则maxpage的值可能会不符
if ( @index + 1 >= @maxpage ) -- 如果输入的当前页号加1大于或等于总页数
set @index = @maxpage - 1 -- 当前页号等于总页数减1,这个意思就是只要是大于总页数的页号,都显示最后一页的数据
if ( @index < 0 ) -- 当@count为0时,@maxpage会等于0,然后上面那个if语句会得出@index=-1,想一想,第-1页?!!!可能存在嘛?(%^&$$$%#$%^%)
set @index = 0 -- 于是当@index<0时,把@index设置为0
set @rowcount = @index * @pagesize + 1
set rowcount @rowcount -- 影响下面那条select语句,返回下面那条select语句的top @rowcount条记录
-- select @startID=id from [dptInfo] where 1=1 order by id desc
select @temp = ' select @startID=id from [dptInfo] where 1=1 ' + @contation + ' order by id desc '
execute sp_executesql -- 执行上面的select语句
@temp ,
N ' @startID varchar(20) output ' ,
@startID output -- 返回@startID的值,@startID的值是上面那条select语句最后一条满足的记录的ID
set rowcount @pagesize -- 影响下面的那条select语句,返回top @pagesize条记录
-- select * from [dptInfo] where id<=@startID order by id desc
select @temp = ' select * from [dptInfo] where id<= ' + @startID + @contation + ' order by id desc ' -- 从@startID开始降序依次取@pagesize条记录
execute sp_executesql -- 执行上面的select语句
@temp
set nocount off
RETURN @maxpage -- 返回总页数,可能会用到
@index int , -- 当前页号,从0开始编号,所以如果该参数是1的话代表的是第二页
@pagesize int , -- 每页数据条数
@contation nvarchar ( 1000 ) -- 判断条件,就是where后面的东东
AS
declare @count int -- 符合查询结果的数据条数
declare @startID varchar ( 20 ) -- 当前页中记录的开始ID,每张表都有自己的主键ID,每条记录都有自己唯一的ID
declare @rowcount int -- 下面会用到set rowcount @rowcount,就是取top @rowcount条记录
declare @maxpage int -- 总页数
declare @temp nvarchar ( 2000 ) -- select语句字符串
SET NOCOUNT ON
if ( LEN ( @contation ) > 0 ) -- 不输入查询条件则默认全部查询,如果输入了查询条件,则LEN(@contation)>0,然后在查询条件最开头加一个 and,即where 1=1 and (查询条件.....)
set @contation = ' and ' + @contation
-- select @count=count(*) from [dptInfo] where 1=1
select @temp = ' select @count=count(*) from [dptInfo] where 1=1 ' + @contation
execute sp_executesql -- 执行查询
@temp ,
N ' @count int output ' ,
@count output -- 返回@count
set @maxpage = ( @count + @pagesize - 1 ) / @pagesize -- 计算总页数,这个是分页计算总页数的公式哦,这个算术表达式一定要这样写,否则maxpage的值可能会不符
if ( @index + 1 >= @maxpage ) -- 如果输入的当前页号加1大于或等于总页数
set @index = @maxpage - 1 -- 当前页号等于总页数减1,这个意思就是只要是大于总页数的页号,都显示最后一页的数据
if ( @index < 0 ) -- 当@count为0时,@maxpage会等于0,然后上面那个if语句会得出@index=-1,想一想,第-1页?!!!可能存在嘛?(%^&$$$%#$%^%)
set @index = 0 -- 于是当@index<0时,把@index设置为0
set @rowcount = @index * @pagesize + 1
set rowcount @rowcount -- 影响下面那条select语句,返回下面那条select语句的top @rowcount条记录
-- select @startID=id from [dptInfo] where 1=1 order by id desc
select @temp = ' select @startID=id from [dptInfo] where 1=1 ' + @contation + ' order by id desc '
execute sp_executesql -- 执行上面的select语句
@temp ,
N ' @startID varchar(20) output ' ,
@startID output -- 返回@startID的值,@startID的值是上面那条select语句最后一条满足的记录的ID
set rowcount @pagesize -- 影响下面的那条select语句,返回top @pagesize条记录
-- select * from [dptInfo] where id<=@startID order by id desc
select @temp = ' select * from [dptInfo] where id<= ' + @startID + @contation + ' order by id desc ' -- 从@startID开始降序依次取@pagesize条记录
execute sp_executesql -- 执行上面的select语句
@temp
set nocount off
RETURN @maxpage -- 返回总页数,可能会用到
ALTER
PROCEDURE
dbo.PR_Article_DelList
@ids nvarchar ( 400 ) -- 一个ArticleID的集合
AS
SET NOCOUNT ON
-- 删除该ID集合中的所有记录
exec ( ' delete from [Article] where ArticleID in ( ' + @ids + ' ) ' )
SET NOCOUNT OFF
RETURN
@ids nvarchar ( 400 ) -- 一个ArticleID的集合
AS
SET NOCOUNT ON
-- 删除该ID集合中的所有记录
exec ( ' delete from [Article] where ArticleID in ( ' + @ids + ' ) ' )
SET NOCOUNT OFF
RETURN
例如:要删除1,2,3,4,5,6这6个ID的记录,则@ids='1,2,3,4,5,6'
存储过程中调用存储过程:
ALTER
PROCEDURE
dbo.PR_AddReply
@titleID int ,
@reUserID int ,
@reContent ntext
AS
declare @s nvarchar ( 4000 )
declare @pro nvarchar ( 100 )
set @pro = ' PR_UpdateTitle '
declare @isReply bit
set @isReply = 1
SET NOCOUNT ON
insert into [ T_Reply ] values ( @titleID , @reUserID , @reContent )
-- 调用另外一个存储过程:PR_UpdateTitle
set @s = @pro + ' ''' + cast ( @titleID as varchar ) + ''' , ''' + cast ( @isReply as varchar ) + ''''
exec ( @s )
SET NOCOUNT OFF
RETURN @@identity
@titleID int ,
@reUserID int ,
@reContent ntext
AS
declare @s nvarchar ( 4000 )
declare @pro nvarchar ( 100 )
set @pro = ' PR_UpdateTitle '
declare @isReply bit
set @isReply = 1
SET NOCOUNT ON
insert into [ T_Reply ] values ( @titleID , @reUserID , @reContent )
-- 调用另外一个存储过程:PR_UpdateTitle
set @s = @pro + ' ''' + cast ( @titleID as varchar ) + ''' , ''' + cast ( @isReply as varchar ) + ''''
exec ( @s )
SET NOCOUNT OFF
RETURN @@identity