通用高效分页存储过程代码
日期:2007-07-31 荐:
-- 获取指定页的数据
CREATE PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = ’*’, -- 需要返回的列
@fldName varchar(255)=’’, -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = ’’ -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
if @strWhere !=’’
set @strSQL = “select count(*) as Total from [“ @tblName “] where “ @strWhere
else
set @strSQL = “select count(*) as Total from [“ @tblName “]“
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strTmp = “〈(select min“
set @strOrder = “ order by [“ @fldName “] desc“
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = “〉(select max“
set @strOrder = “ order by [“ @fldName “] asc“
end
if @PageIndex = 1
begin
if @strWhere != ’’
set @strSQL = “select top “ str(@PageSize) “ “ @strGetFields “ from [“ @tblName “] where “ @strWhere “ “ @strOrder
else
set @strSQL = “select top “ str(@PageSize) “ “ @strGetFields “ from [“ @tblName “] “ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = “select top “ str(@PageSize) “ “ @strGetFields “ from [“
@tblName “] where [“ @fldName “]“ @strTmp “([“ @fldName “]) from (select top “ str((@PageIndex-1)*@PageSize) “ [“ @fldName “] from [“ @tblName “]“ @strOrder “) as tblTmp)“ @strOrder
if @strWhere != ’’
set @strSQL = “select top “ str(@PageSize) “ “ @strGetFields “ from [“
@tblName “] where [“ @fldName “]“ @strTmp “([“
@fldName “]) from (select top “ str((@PageIndex-1)*@PageSize) “ [“
@fldName “] from [“ @tblName “] where “ @strWhere “ “
@strOrder “) as tblTmp) and “ @strWhere “ “ @strOrder
end
end
exec (@strSQL)
GO
作者Blog:http://blog.csdn.net/yangyifan0/
相关文章
总结:ADO.NET在开发中的部分使用方法和技巧
.NET 数据访问体系结构指南一
.NET 数据访问体系结构指南一
通用高效分页存储过程代码
Asp.Net细节性问题精萃
对该文的评论
jedliu ( 2006-02-10)
不够精简
domino_question ( 2006-02-10)
这个适用于sql server.
nicesky1 ( 2006-01-31)
老兄,我稍微修改了一下你的代码。。这样使我感觉更实用些了,不当之处,还望多多包涵!
CREATE alter PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = ’*’, -- 需要返回的列
@fldName varchar(255), -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = ’’ -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
set @strSQL =’declare @strSizeNumber as int;declare @strPageNumber as int;’
if @strWhere !=’’
set @strSQL = @strSQL ’select @strSizeNumber=count(*) from [’ @tblName ’] where ’ @strWhere ’;’
else
set @strSQL = @strSQL ’select @strSizeNumber=count(*) from [’ @tblName ’]’ ’;’
set @strSQL=@strSQL ’set @strPageNumber=ceiling(cast(@strSizeNumber as float)/ cast (’ str(@pageSize) ’ as float))’
set @strSQL = @strSQL ’select @strSizeNumber as TotalRecordSize,@strPageNumber as TotalPageSize;’
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strTmp = ’〈(select min’
set @strOrder = ’ order by [’ @fldName ’] desc’
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = ’〉(select max’
set @strOrder = ’ order by [’ @fldName ’] asc’
end
if @PageIndex = 1
begin
if @strWhere != ’’
set @strSQL = ’select top ’ str(@PageSize) ’ ’ @strGetFields ’ from [’ @tblName ’] where ’ @strWhere ’ ’ @strOrder
else
set @strSQL = ’select top ’ str(@PageSize) ’ ’ @strGetFields ’ from [’ @tblName ’] ’ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
if @strWhere != ’’
set @strSQL = ’select top ’ str(@PageSize) ’ ’ @strGetFields ’ from [’
@tblName ’] where [’ @fldName ’]’ @strTmp ’([’
@fldName ’]) from (select top ’ str((@PageIndex-1)*@PageSize) ’ [’
@fldName ’] from [’ @tblName ’] where ’ @strWhere ’ ’
@strOrder ’) as tblTmp) and ’ @strWhere ’ ’ @strOrder
else
set @strSQL = ’select top ’ str(@PageSize) ’ ’ @strGetFields ’ from [’
@tblName ’] where [’ @fldName ’]’ @strTmp ’([’ @fldName ’]) from (select top ’ str((@PageIndex-1)*@PageSize) ’ [’ @fldName ’] from [’ @tblName ’]’ @strOrder ’) as tblTmp)’ @strOrder
end
end
exec (@strSQL)
GO
标签: