获取总共多少条数据的参数dataCount非常简单,执行Sql语句“select count(*) from test”就可以拿到dataCount值了,还有一个非常简单的参数就是当前页数(页码)pageIndex默认就是1。
每页显示多少条数据根据网页显示量来设定,假设网页一页显示10,那么pageSize就是10,有dataCount和pageSize值,总共有多少页数也就可以获得了,pageCount=dataCount/pageSize,通过这样计算页数方式获得的数据量一定小于实际的页数,这里就需要用到取顶函数pageCount=1.0*dataCount/pageSize。
关键就是如何通过准备的参数获取数据,还需要用到Sql Server2005及以上版本的数据库才有的给数据库表数据查询时增加序号的函数,这是因为我们存放在数据库的数据没有连续自动增长的编号,借助函数row_number()可以通过按某个字段排序设定序号,方便获取数据准确。
比较两条Sql语句“select * from test”和“select *,row_number() over(order by Test1) as '序号' from Test”查询数据进行比较就会发现在查询结果中会增加一个通过字段Test1排序而产生的一个序号,并且这个序号是连续自动增长的。
接下来创建存储过程,指定参数就可以了。
create proc P_Test--创建存储过程P_Test
@pageSize int,--每页数据条数
@pageIndex int,--当前页数(页码)
@pageCount int output--总的页数,因为需要显示页数,因此是个输出参数
as
declare @datacount int--总数据条数
select @datacount=count(*) from test--获得总数据条数值并赋给参数
set @pageCount=ceiling(1.0*@datacount/@pageSize)--获得总页数,并赋给参数
--接下来是获得指定页数据
select * from
(select *,row_number() over(order by Test1) as num from test) as temp
where num between @pageSize*(@pageIndex-1)+1 and @pageSize*@pageIndex
一个不带limit 一个带limit。以php+mysql为例首先,连接数据库,写一条sql语句把你要查询的信息总量查找出来sql = select count(*) from tb,$all_page ;设定每页显示条数, $display 。然后,当前页为$page ;在写一句sql = select * from tb limit $dispaly*($page - 1),$display最后,在页面显示分页信息把当前页传回给分页处理页,一定要把相关的条件一起传回去,get 方式传值,否则查询条件改变查询信息就不正确。 网上有好多封装好的分页类。我也有一个很好用的分页类,如果请我吃肉就发给你一份哈。。\(^o^)/~ 追问: 这个$all_page用在哪儿,怎么将当前页传回给分页处理页。显示的时候那些“首页”“上一页”“下一页”“末页”是链接吗、链到什么地方,还是别的什么 回答: $all_page是查询总数,总是页数等于查询总数除以每页显示的信息。$num_page = ceil($all_page/$display)用get方式把当前页传给分页处理页,就是<a href = "连接到本页或着不写也就是当前页?page=当前页码"></a>标签 别的我也想不起来,让我自己写分页,我只会最简单的那种,一般我都是调用一个现成的分页类。只需传个参数就Ok,连样式都不用写的。。。CREATEPROC
sp_PageView
@tbname
sysname,
--要分页显示的表名
@FieldKey
nvarchar(1000),
--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent
int=1,
--要显示的页码
@PageSize
int=10,
--每页的大小(记录数)
@FieldShow
nvarchar(1000)='',
--以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder
nvarchar(1000)='',
--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序
@Where
nvarchar(1000)='',
--查询条件
@PageCount
int
OUTPUT
--总页数
AS
SET
NOCOUNT
ON
--检查对象是否有效
IF
OBJECT_ID(@tbname)
IS
NULL
BEGIN
RAISERROR(N'对象"%s"不存在',1,16,@tbname)
RETURN
END
IF
OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND
OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND
OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
RETURN
END
--分页字段检查
IF
ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END
--其他参数检查及规范
IF
ISNULL(@PageCurrent,0)<1
SET
@PageCurrent=1
IF
ISNULL(@PageSize,0)<1
SET
@PageSize=10
IF
ISNULL(@FieldShow,N'')=N''
SET
@FieldShow=N'*'
IF
ISNULL(@FieldOrder,N'')=N''
SET
@FieldOrder=N''
ELSE
SET
@FieldOrder=N'ORDER
BY
'+LTRIM(@FieldOrder)
IF
ISNULL(@Where,N'')=N''
SET
@Where=N''
ELSE
SET
@Where=N'WHERE
('+@Where+N')'
--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
IF
@PageCount
IS
NULL
BEGIN
DECLARE
@sql
nvarchar(4000)
SET
@sql=N'SELECT
@PageCount=COUNT(*)'
+N'
FROM
'+@tbname
+N'
'+@Where
EXEC
sp_executesql
@sql,N'@PageCount
int
OUTPUT',@PageCount
OUTPUT
SET
@PageCount=(@PageCount+@PageSize-1)/@PageSize
END
--计算分页显示的TOPN值
DECLARE
@TopN
varchar(20),@TopN1
varchar(20)
SELECT
@TopN=@PageSize,
@TopN1=@PageCurrent*@PageSize
--第一页直接显示
IF
@PageCurrent=1
EXEC(N'SELECT
TOP
'+@TopN
+N'
'+@FieldShow
+N'
FROM
'+@tbname
+N'
'+@Where
+N'
'+@FieldOrder)
ELSE
BEGIN
--生成主键(惟一键)处理条件
DECLARE
@Where1
nvarchar(4000),@s
nvarchar(1000)
SELECT
@Where1=N'',@s=@FieldKey
WHILE
CHARINDEX(N',',@s)>0
SELECT
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1
+N'
AND
a.'+LEFT(@s,CHARINDEX(N',',@s)-1)
+N'='+LEFT(@s,CHARINDEX(N',',@s)-1)
SELECT
@Where1=STUFF(@Where1+N'
AND
a.'+@s+N'='+@s,1,5,N''),
@TopN=@TopN1-@PageSize
--执行查询
EXEC(N'SET
ROWCOUNT
'+@TopN1
+N'
SELECT
'+@FieldKey
+N'
INTO
#
FROM
'+@tbname
+N'
'+@Where
+N'
'+@FieldOrder
+N'
SET
ROWCOUNT
'+@TopN
+N'
DELETE
FROM
#'
+N'
SELECT
'+@FieldShow
+N'
FROM
'+@tbname
+N'
a
WHERE
EXISTS(SELECT
*
FROM
#
WHERE
'+@Where1
+N')
'+@FieldOrder)
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)