SQL分页的存储过程
-------------------------------------------------------------------------------------
/*
函数名称: sp_Sys_GetRecordFromPage
函数功能: 获取指定页的数据
作者:长沙网站建设 http://www.innto.cn
参数说明: @tblName 包含数据的表名
@fldName 关键字段名
@PageSize 每页记录数
@PageIndex 要获取的页码
@OrderType 排序类型, 0 - 升序, 1 - 降序
@strWhere 查询条件 (注意: 不要加 where)
作 者: 笑书神侠
*/
CREATE PROCEDURE sp_Sys_GetRecordFromPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(2000) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(1000) -- 临时变量
declare @strOrder varchar(500) -- 排序类型
--字段名@fldName
--先确定 OrderType
if @fldName ='id'
begin
if @OrderType != 0
begin
set @strOrder = ' order by [id] desc'
end
else
begin
set @strOrder = ' order by [id] asc'
end
end
else
begin
if @OrderType != 0
begin
set @strOrder = ' order by [' + @fldName + '] desc , [id] desc '
end
else
begin
set @strOrder = ' order by [' + @fldName + '] asc , [id] desc'
end
end
if @fldName=''
set @strOrder = ''
if @PageIndex <1
set @PageIndex =1
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where (' + @strWhere + ')'
set @strSQL = 'select top ' + str(@PageSize) + ' * from [' + @tblName + ']' + @strTmp + ' ' + @strOrder
end
else
begin
set @strTmp = ''
if @strWhere = ''
begin
set @strSQL = 'Select top ' + str(@PageSize) +
' * from ['+ @tblName + '] where id not in ( Select top ' +
str((@PageIndex-1)*@PageSize) + ' id from ['+ @tblName
+ '] ' + @strOrder +' ) ' + @strOrder
end
else
begin
set @strSQL = 'Select top ' + str(@PageSize) +
' * from ['+ @tblName + '] where id not in ( Select top ' +
str((@PageIndex-1)*@PageSize) + ' id from ['+ @tblName
+ '] where ' + @strWhere + @strOrder+' ) and ' + @strWhere + @strOrder
end
end
print @strSQL
exec (@strSQL)
GO
用存储过程的话效率就非常高,这个是我自己用了很久的,修复了网上一些存储过程的BUG.