技术开发 频道

经典的翻页存储过程

  【IT168技术文档】

  最近找到一很好的SQL翻页存储过程,用过都觉得很不错,执行效率也可以,在此推荐给大家.

CREATE proc up_GetTopicList
@a_TableList Varchar(200), --要查询的字段
@a_TableName Varchar(30), --要查询的表名
@a_SelectWhere Varchar(500), --查询限制条件
@a_SelectOrderId Varchar(20), --查询主键
@a_SelectOrder Varchar(50), --排序字段
@a_intPageNo int,
@a_intPageSize int,
@RecordCount int OUTPUT
as
/**//*定义局部变量*/
declare @intBeginID int
declare @intEndID int
declare @intRootRecordCount int
declare @intRowCount int
declare @TmpSelect NVarchar(600)
/**//*关闭计数*/
set nocount on
/**//*求总共根贴数*/
select @TmpSelect = 'set nocount on;
select @SPintRootRecordCount = count(*) from '+@a_TableName+' '+@a_SelectWhere execute sp_executesql @TmpSelect, N'@SPintRootRecordCount int OUTPUT', @SPintRootRecordCount=@intRootRecordCount OUTPUT select @RecordCount = @intRootRecordCount if (@intRootRecordCount = 0) --如果没有贴子,则返回零 return 0 /**//*判断页数是否正确*/ if (@a_intPageNo - 1) * @a_intPageSize > @intRootRecordCount return (-1) /**//*求开始rootID*/ set @intRowCount = (@a_intPageNo - 1) * @a_intPageSize + 1 /**//*限制条数*/ select @TmpSelect = 'set nocount on;set rowcount @SPintRowCount;
select @SPintBeginID = '+@a_SelectOrderId+'
from '+@a_TableName+' '+@a_SelectWhere+' '+@a_SelectOrder execute sp_executesql @TmpSelect, N'@SPintRowCount int,@SPintBeginID int OUTPUT', @SPintRowCount=@intRowCount,@SPintBeginID=@intBeginID OUTPUT /**//*结束rootID*/ set @intRowCount = @a_intPageNo * @a_intPageSize /**//*限制条数*/ select @TmpSelect = 'set nocount on;set rowcount @SPintRowCount;
select @SPintEndID = '+@a_SelectOrderId+'
from '+@a_TableName+' '+@a_SelectWhere+' '+@a_SelectOrder execute sp_executesql @TmpSelect, N'@SPintRowCount int,@SPintEndID int OUTPUT', @SPintRowCount=@intRowCount,@SPintEndID=@intEndID OUTPUT if @a_SelectWhere='' or @a_SelectWhere IS NULL select @TmpSelect = 'set nocount off;set rowcount 0;select '+@a_TableList+'
from '+@a_TableName+' where '+@a_SelectOrderId+' between ' else select @TmpSelect = 'set nocount off;set rowcount 0;select '+@a_TableList+'
from '+@a_TableName+' '+@a_SelectWhere+' and '+@a_SelectOrderId+' between ' if @intEndID > @intBeginID select @TmpSelect = @TmpSelect+'@SPintBeginID and @SPintEndID'+' '+@a_SelectOrder else select @TmpSelect = @TmpSelect+'@SPintEndID and @SPintBeginID'+' '+@a_SelectOrder execute sp_executesql @TmpSelect, N'@SPintEndID int,@SPintBeginID int', @SPintEndID=@intEndID,@SPintBeginID=@intBeginID return(@@rowcount) --select @@rowcount GO
 
0
相关文章