--名称:分页存储过程(sql2000通用型) --使用示例 -- Declare @start int -- EXEC dbo.sp_page '*','s_admin where iid>=7','order by logintimes desc',30,1, @start out -- print @start --注意 --目前还没有对输入的参数进行严格的验证 --默认为输入都是合法有效的 ALTER PROCEDURE dbo.sp_page ( @fields varchar(800) --SELECT 后面 FROM 前面 的 字段 不用包含SELECT ,@sqlFrom varchar(800) --FROM 后面 的 字段 不包含FROM ,@sqlOrderBy varchar(800) -- Order By 后面的字符,包括Order By ,@pageSize int -- 每页数据行数 ,@pageIndex int --要转到的页码 ,@records int OUTPUT -- 当前查询条件下的总记录数 ) AS BEGIN Declare @sqlStr nvarchar(800) -- 取得总记录数 set @sqlStr='select @records = count(*) from ' + @sqlFrom --执行@sql中的语句 exec sp_executesql @sqlStr ,N'@records varchar(1000) out' --表示@sqlStr中的语句包含了一个输出参数 ,@records out --和调用存储过程差不多,指定输出参数值 -- 根据每页数据行数 和 要转到的页码 得到 数据起止点 Declare @start int Declare @end int set @end = @pageSize * @pageIndex set @start = @pageSize * (@pageIndex - 1) + 1 -- 临时表名称 可随机命名 Declare @tmpTable varchar(12) SET @tmpTable ='#tmp'+ left(newid(),8) -- 创建数据源到临时表 SELECT @sqlStr = 'SELECT Identity(int,1,1) AS RowIndex, * INTO '+ @tmpTable SELECT @sqlStr = @sqlStr + ' FROM (SELECT TOP ' + Convert(char,@end )+ @fields + ' FROM ' + rtrim(@sqlFrom) + ' '+ rtrim(@sqlOrderBy) + ') A' -- 查询临时表 得到所需要的数据 SELECT @sqlStr = @sqlStr + ' '+'SELECT '+ rtrim(@fields) +' FROM ' + @tmpTable SELECT @sqlStr = @sqlStr + ' WHERE RowIndex BETWEEN ' + Convert(char,@start) + ' AND ' + Convert(char,@end) -- 删除临时表 SELECT @sqlStr = @sqlStr + ' '+'DROP TABLE '+@tmpTable EXEC (@sqlStr) END RETURN |
|