做一个模糊查询,比如有【性别,年龄范围,身高范围,地区等模糊查询条件】而查询条件可以选可以不选的情况,如果不加分页的存续过程,我就会写!想请教的是,如果家分页空间的存续过程应该怎么写呢?
数据库是SQL2000的
存储过程也支持分页啊,你只要为存储过程定义参数就可以了啊。
比如 表名、显示字段、条件、排序、每页数据行数,然后拼接sql 执行。下边是一个通用的例子
CREATE PROCEDURE sp_general_pagination
(
@psTblName varchar(1000) =null, -- 设置表名
@psStrGetFields varchar(400) ='*', -- 设置输出字段名
@psFieldName varchar(400) =null, -- 设置排序字段名(只能设1个字段,最好为字符串和数字型,其它类型字段会出错)
@psPageSize int =10, -- 设置分页尺寸,大于0
@psPageIndex int =1, -- 设置分页码,大于0
@psOrderType bit =0, -- 排序类型,非0值则降序
@psStrWhere varchar(8000) =null, -- 设置条件,不加where
@rsPageCount int =0 output, -- 输出页数
@rsRecordCount int =0 output, -- 输出记录数
@psFieldName2 varchar(32) =null -- 第二排序字段
)
as
Begin
Set nocount on
-- 参数合法检查
If (dbo.fu_isnull(@psTblName)=0 or
dbo.fu_isnull(@psFieldName)=0 or
dbo.fu_isnull(@psPageIndex)=0 or
dbo.fu_isnull(@psPageSize)=0 or
@psPageIndex<=0 or
@psPageSize<=0)
Begin
return 0
End
-- 判断返回列名字段为空时设置为'*'
If (dbo.fu_isnull(@psStrGetFields)=0)
Begin
Set @psStrGetFields='*'
End
-- 定义参数
Declare @strNsql nvarchar(4000) -- 主语句
Declare @strSql varchar(8000) -- 主语句
Declare @strMax varchar(1000) -- 求Max()语句
Declare @strFlag varchar(20) -- 标致值'<','>'
Declare @strParams varchar(500) -- 参数值
Declare @strOrder varchar(500) -- 排序类型
Declare @strPageSize varchar(20) -- 页大小
Declare @strDropTbls varchar(100) -- 删除临时数
-- 计算总记录数(OUTPUT参数)
If (dbo.fu_isnull(@psStrWhere)=1)
Begin
Set @strNsql=' select @rsRecordCount=count(1) '+' from '+@psTblName+' where '+@psStrWhere
End
Else
Begin
Set @strNsql=' select @rsRecordCount=count(1) '+' from '+@psTblName
End
-- 执行SQL语句,求出总记录数
Exec sp_executesql @strNsql,N'@rsRecordCount int output',@rsRecordCount output
If @@error<>0
Begin
return 0
End
-- 判断Count('*')总数是否为0
If (@rsRecordCount<=0)
Begin
Set @rsPageCount=0
Exec ('select '+@psStrGetFields+' from '+@psTblName+' where 1=2')
If @@error<>0
Begin
return 0
End
Else
Begin
return 1
End
End
Else
Begin
-- 计算总页数(output参数)
Set @rsPageCount=ceiling(@rsRecordCount*1.0/@psPageSize)
End
-- 把页大小转换为字符串
Set @strPageSize=str(@psPageSize)
-- 分页码大于总页数,则把分页码置为总页数,表示取最后一页
If (@psPageIndex>@rsPageCount and @rsPageCount>0)
Begin
Set @psPageIndex=@rsPageCount
End
-- 如果@psOrderType不是0,则降序
If (@psOrderType<>0)
Begin
Set @strFlag='<'
Set @strParams='min'
Set @strOrder=' order by '+@psFieldName+' desc '
--检查第二排序字段是否为空,不是的话,按照第二字段排序
if(dbo.fu_isnull(@psFieldName2)=1)
begin
Set @strOrder=' order by '+@psFieldName+' desc '+','+@psFieldName2+' desc '
end
End
Else
Begin
Set @strFlag='>'
Set @strParams='max'
Set @strOrder=' order by '+@psFieldName+' asc '
--检查第二排序字段是否为空,不是的话,按照第二字段排序
if(dbo.fu_isnull(@psFieldName2)=1)
begin
Set @strOrder=' order by '+@psFieldName+' asc '+','+@psFieldName2+' asc '
end
End
-- 主语句(如果是第一次则加速执行)
If (@psPageIndex=1)
Begin
If (dbo.fu_isnull(@psStrWhere)=1)
Begin
Set @strSql=' select top '+ltrim(rtrim(str(@psPageSize)))+' '+@psStrGetFields+' from '+@psTblName+' where '
End
Else
Begin
Set @strSql=' select top '+ltrim(rtrim(str(@psPageSize)))+' '+@psStrGetFields+' from '+@psTblName
End
End
Else
Begin
-- 如果TOP值少于5300,把数据插入临时表,求MAX值
If ((@psPageIndex-1)*@psPageSize)<=5300
Begin
Set @strMax=' select top '
+ ltrim(rtrim(str((@psPageIndex-1)*@psPageSize)))+' '+@psStrGetFields
+ ' into #Tbls from '+@psTblName
Set @strDropTbls =' drop table #Tbls'
-- 判断是否有条件值
If (dbo.fu_isnull(@psStrWhere)=1)
Begin
Set @strMax=@strMax+' where '+@psStrWhere+' '+@strOrder
Set @strSql='select top '+ltrim(rtrim(str(@strPageSize)))+' '+@psStrGetFields+' from '+@psTblName
+ ' where '+@psFieldName+''+@strFlag+'(select '
+ @strParams+'('+@psFieldName+') from #Tbls) and '
End
Else
Begin
Set @strMax=@strMax+@strOrder
Set @strSql='select top '+ltrim(rtrim(str(@strPageSize)))+' '+@psStrGetFields+' from '+@psTblName
+ ' where '+@psFieldName+''+@strFlag+'(select '
+ @strParams+'('+@psFieldName+') from #Tbls) '
End
End
Else
Begin
-- 不用临时表来求SQL语句
Set @strMax='declare @strTmp varchar(500)'
+ ' select @strTmp= '+@strParams+'('+@psFieldName+') from (select top '
+ ltrim(rtrim(str((@psPageIndex-1)*@psPageSize)))+' '+@psFieldName+' from '
+ @psTblName
-- 判断是否有条件值
If (dbo.fu_isnull(@psStrWhere)=1)
Begin
Set @strSql=' where '+@psStrWhere+' '+@strOrder+') as tblTmp select top '
+ @strPageSize+' '+@psStrGetFields+' from '+@psTblName
+ ' where '+@psFieldName+' '+@strFlag+' @strTmp and '
End
Else
Begin
Set @strSql=@strOrder+') as tblTmp select top '
+ @strPageSize+' '+@psStrGetFields+' from '+@psTblName
+ ' where '+@psFieldName+' '+@strFlag+' @strTmp '
End
End
End
-- 输出
Exec (@strMax+@strSql+@psStrWhere+@strOrder+@strDropTbls)
--print @strMax+@strSql+@psStrWhere+@strOrder+@strDropTbls
If @@error<>0
Begin
return 0
End
Else
Begin
return 1
End
End
GO
直接用.NETPager分页控件就好了
可以用DataAdapter Fill的方式选择填充多少记录,但这种方式是把所有的记录都查询出来。
最简单用 select top 10 * from table where id not in (select top ((pageCount-1)*pageSize) id from table),这种方式支持多种排序的方式
如果是按一定顺序排序,那么可以用MAX Id的函数也可以做分页
如果是sql 2005 可以用row_num的方式分页
如果用Linq to sql,可以用Skip().Take()的方式分页