sqlserver 通用分页存储过程(转)

  1 USE [AAA_TYDC]
  2 GO
  3 /****** Object:  StoredProcedure [dbo].[proc_DataPagination]    Script Date: 11/20/2014 11:04:47 ******/
  4 SET ANSI_NULLS ON
  5 GO
  6 SET QUOTED_IDENTIFIER ON
  7 GO
  8  
  9 /*********************************************************  
 10 * 作    用:数据分页
 11 * 作    者:evafly920
 12 * 作者博客:http://blog.csdn.net/evafly920/article/details/614813
 13 * 创建日期:2003-11-23
 14 * 修改日期:2014-11-23 
 15 * 使用说明:
 16     --调用例子:
 17     --1.单表/单排序
 18     EXEC proc_DataPagination @TableNames='bigtable',@PrimaryKey='d_id',@Fields='d_id,d_title,d_content,d_time',@PageSize=20,@CurrentPage=1,@Filter ='',@Group='',@Order='d_id desc'
 19     --2.单表/多排序
 20     EXEC proc_DataPagination 'bigtable','d_id','*',20,0,'','','d_time asc,d_id desc'
 21     --3.多表/单排序
 22     EXEC proc_DataPagination 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_id asc'
 23     --4.多表/多排序
 24     EXEC proc_DataPagination 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_time asc,bigtable.d_id desc'
 25 
 26 *********************************************************/  
 27  ALTER PROCEDURE [dbo].[proc_DataPagination]  
 28 @TableNames VARCHAR(200),    --表名,可以是多个表,但不能用别名
 29 @PrimaryKey VARCHAR(100),    --主键,可以为空,但@Order为空时该值不能为空
 30 @Fields    VARCHAR(200),        --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
 31 @PageSize INT,            --每页记录数
 32 @CurrentPage INT,        --当前页,0表示第1页
 33 @Filter VARCHAR(200) = '',    --条件,可以为空,不用填 where
 34 @Group VARCHAR(200) = '',    --分组依据,可以为空,不用填 group by
 35 @Order VARCHAR(200) = ''    --排序,可以为空,为空默认按主键升序排列,不用填 order by
 36 AS
 37 BEGIN
 38     DECLARE @SortColumn VARCHAR(200)
 39     DECLARE @Operator CHAR(2)
 40     DECLARE @SortTable VARCHAR(200)
 41     DECLARE @SortName VARCHAR(200)
 42     IF @Fields = ''
 43         SET @Fields = '*'
 44     IF @Filter = ''
 45         SET @Filter = 'WHERE 1=1'
 46     ELSE
 47         SET @Filter = 'WHERE ' +  @Filter
 48     IF @Group <>''
 49         SET @Group = 'GROUP BY ' + @Group
 50 
 51     IF @Order <> ''
 52     BEGIN
 53         DECLARE @pos1 INT, @pos2 INT
 54         SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')
 55         IF CHARINDEX(' DESC', @Order) > 0
 56             IF CHARINDEX(' ASC', @Order) > 0
 57             BEGIN
 58                 IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)
 59                     SET @Operator = '<='
 60                 ELSE
 61                     SET @Operator = '>='
 62             END
 63             ELSE
 64                 SET @Operator = '<='
 65         ELSE
 66             SET @Operator = '>='
 67         SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')
 68         SET @pos1 = CHARINDEX(',', @SortColumn)
 69         IF @pos1 > 0
 70             SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
 71         SET @pos2 = CHARINDEX('.', @SortColumn)
 72         IF @pos2 > 0
 73         BEGIN
 74             SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
 75             IF @pos1 > 0 
 76                 SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)
 77             ELSE
 78                 SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)
 79         END
 80         ELSE
 81         BEGIN
 82             SET @SortTable = @TableNames
 83             SET @SortName = @SortColumn
 84         END
 85     END
 86     ELSE
 87     BEGIN
 88         SET @SortColumn = @PrimaryKey
 89         SET @SortTable = @TableNames
 90         SET @SortName = @SortColumn
 91         SET @Order = @SortColumn
 92         SET @Operator = '>='
 93     END
 94 
 95     DECLARE @type varchar(50)
 96     DECLARE @prec int
 97     SELECT @type=t.name, @prec=c.prec
 98     FROM sysobjects o 
 99     JOIN syscolumns c on o.id=c.id
100     JOIN systypes t on c.xusertype=t.xusertype
101     WHERE o.name = @SortTable AND c.name = @SortName
102     IF CHARINDEX('char', @type) > 0
103     SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
104 
105     DECLARE @TopRows INT
106     SET @TopRows = @PageSize * @CurrentPage + 1
107     print @TopRows
108     print @Operator
109     EXEC('
110         DECLARE @SortColumnBegin ' + @type + '
111         SET ROWCOUNT ' + @TopRows + '
112         SELECT @SortColumnBegin=' + @SortColumn + ' FROM  ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + '
113         SET ROWCOUNT ' + @PageSize + '
114         SELECT ' + @Fields + ' FROM  ' + @TableNames + ' ' + @Filter  + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + '    
115     ')    
116 END
117 
118 GO