


/**//*

說明: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 = '<='