


/**//*

说明:1.支持多表查询 2.支持任意排序 3.不支持表别名

参考了

evafly920:[分享]千万数量级分页存储过程(效果演示)

地址:http://blog.csdn.net/evafly920/archive/2006/03/03/614813.ASPx


IF(EXISTS(SELECT * FROM sysobjects WHERE [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))

DROP PROCEDURE usp_PagingLarge

*/


GO


CREATE PROCEDURE usp_PagingLarge

@TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名

@PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空

@Fields VARCHAR(200), --要取出的字段,可以是多个表的字段,可以为空,为空表示select *

@PageSize INT, --每页记录数

@CurrentPage INT, --当前页,0表示第1页

@Filter VARCHAR(200) = '', --条件,可以为空,不用填 where

@Group VARCHAR(200) = '', --分组依据,可以为空,不用填 group by

@Order VARCHAR(200) = '' --排序,可以为空,为空默认按主键升序排列,不用填 order by

AS

BEGIN

DECLARE @SortColumn VARCHAR(200)

DECLARE @Operator CHAR(2)

DECLARE @SortTable VARCHAR(200)

DECLARE @SortName VARCHAR(200)

IF @Fields = ''

SET @Fields = '*'

IF @Filter = ''

SET @Filter = 'WHERE 1=1'

ELSE

SET @Filter = 'WHERE ' + @Filter

IF @Group <>''

SET @Group = 'GROUP BY ' + @Group


IF @Order <> ''

BEGIN

DECLARE @pos1 INT, @pos2 INT

SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')

IF CHARINDEX(' DESC', @Order) > 0

IF CHARINDEX(' ASC', @Order) > 0

BEGIN

IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)

SET @Operator = '<='