declare @TotalNum int
exec Select_Page 10,1,'sysobjects','id',' ','order by id asc ',@TotalNum out
select 记录总数=@TotalNum/*--结果:
(所影响的行数为 10 行)记录总数
-----------
22(所影响的行数为 1 行)--*/
exec Select_Page 10,1,'sysobjects','id',' ','order by id asc ',@TotalNum out
select 记录总数=@TotalNum/*--结果:
(所影响的行数为 10 行)记录总数
-----------
22(所影响的行数为 1 行)--*/
-------------------------------@i得作用是快速移动到@i>@previous得位置,然后把满足这个条件得记录得唯一值存到一个字符串里面,这样做是用来对符合条件的记录进行分页,取我们需要的页。我是参考这里做的:
http://www.microsoft.com/china/community/Column/49.mspx
--------------------------------------
另外注意一点在前台对存储过程的调用,不可能同时返回结果集和@TotalNum 的值,一次调用只能选择返回其中一种.
-------------------------------------
我试过,可以同时返回结果集和@TotalNum,不知道是不是我哪里弄错了。哦,有一点我忘记说了,如果order by是对一个普通字段,可以获得我要的结果,是正常的。但是如果是对一个以nvarchar类型存储的日期字符串排序(order by convert(datetime, Register_Date) asc )就发生了我遇到的问题:返回了空结果集,但@TotalNum却是对的。写了很多,罗嗦了。抱歉。麻烦你了。如果太麻烦就不要为我弄了,多谢
@PageSize int, --页面大小
@CurrPage int, --当前页号,从1开始
@TableName nvarchar(100), --表名
@UniqueField nvarchar(100), --一般为具有唯一值的关键字段,算法实现需要。注意:视该字段的类型需要适当修改代码。
@Where nvarchar(1000), --搜索条件,例子: where fileld=value
@OrderBy nvarchar(200), --排序字段,例子:order by name desc
@TotalNum int output --符合条件的记录总数
AS
set nocount on
declare @s nvarchar(4000)--得到符合搜索条件的记录总数,只是得到总数,不需要order by
set @TotalNum = 0
set @s = N'select @TotalNum=@TotalNum+1 from ' + @TableName + ' ' + @Where + ' ' + @OrderBy
exec sp_executesql @s, N'@TotalNum int output',@TotalNum output--得到符合条件的记录
if @CurrPage=1 --如果是第一页,直接用top就可以出到结果了
begin
set rowcount @PageSize
exec(N'select * from ' + @TableName + ' ' + @Where + ' ' + @OrderBy)
end
else --否则,就要生成要查询的关键字列表
begin
declare @top1 int,@top2 int
select @top1=@CurrPage*@PageSize
,@top2=(@CurrPage-1)*@PageSize
,@s='set rowcount @top1
select ' + @UniqueField +' into #t from ' + @TableName + ' ' + @Where + ' ' + @OrderBy+'
set rowcount @top2
delete from #t
select * from ' + @TableName + ' a
where exists(
select * from #t
where ' + @UniqueField +' = a.' + @UniqueField +')
' + @OrderBy
exec sp_executesql @s
,N'@top1 int,@top2 int'
,@top1,@top2
end
set rowcount 0
GO