对任意select语句进行分页的通用存储过程(SQL2005)
2010-10-01 10:24:16 来源:WEB开发网CREATE PROCEDURE [dbo].[usp_ResultWithPage]
@fields_Type varchar(1000), --字段列表(带类型),用于@t表变量的字段声明,如:PhotoID int,UserID int,PhotoTitle nvarchar(50)
@fieldsInT varchar(500), --字段列表(不带类型),用于分页部分读取@t表变量的字段,也可使用*代替,但性能会下降,如:PhotoID ,UserID ,PhotoTitle
@selectSrting varchar(2000), --向@t表变量中读取记录的Select语句,如:SELECT PhotoID ,UserID ,PhotoTitle FROM Photo_Basic
@result_OrderBy varchar(200), --对分页结果进行排序的字段,如:升序'PhotoID ASC'、降序'PhotoID DESC',注意:如果是降序的话要在selectSrting和此处都加DESC
@pageSize int, --页尺寸,0表示返回所有行
@currentPage int, --当前页,首页为1
@IsReCount bit -- 非0值则返回记录总数
AS
BEGIN
---------------得到表变量@t-------------------------
DECLARE @strSql varchar(2000)
SET @strSql = 'DECLARE @t TABLE(' + @fields_Type + ');'
SET @strSql = @strSql + 'INSERT INTO @t ' + @selectSrting + ';'
--显示表变量的内容
--SET @strSql = @strSql + 'SELECT ' + @fieldsInT + ' FROM @t;'
----------进行分页------------------------------------
IF @pageSize = 0
SET @strSql = @strSql + 'SELECT ' + @fieldsInT + ' FROM @t ;'
ELSE
IF @currentPage = 1
SET @strSql = @strSql + 'SELECT TOP( ' + Str(@pageSize) + ') ' + @fieldsInT + ' FROM @t ;'
ELSE
BEGIN
SET @strSql = @strSql + 'SELECT TOP( ' + Str(@pageSize) + ') ' + @fieldsInT + ' FROM ( SELECT TOP(' + Str(@pageSize * @currentPage) + ') ' + @fieldsInT + ' , ROW_NUMBER() OVER (ORDER BY ' + @result_OrderBy + ')'
SET @strSql = @strSql + ' AS RowNumber FROM @t'
SET @strSql = @strSql + ' ) AS r WHERE r.RowNumber > ' + Str(@pageSize * (@currentPage - 1)) + ';'
END
IF @IsReCount != 0
SET @strSql = 'SELECT COUNT(1) AS Total FROM @t ;'
--RETURN @strSql
EXEC(@strSql)
-----------------------
END
更多精彩
赞助商链接