码迷,mamicode.com
首页 > 其他好文 > 详细

存储过程分页(一)

时间:2015-05-04 15:10:57      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:

(分页一) 简单分页
--ROW_NUMBER()实现分页功能

DECLARE @pagenum AS INT, @pagesize AS INT
SET @pagenum = 1
SET @pagesize = 10
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY id DESC) AS rownum, id,user_name

FROM SYS_User_Info) AS D
WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
ORDER BY id DESC

/**//*
技术分享说明: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 = ‘<=‘
技术分享                ELSE
技术分享                    SET @Operator = ‘>=‘
技术分享            END
技术分享            ELSE
技术分享                SET @Operator = ‘<=‘
技术分享        ELSE
技术分享            SET @Operator = ‘>=‘
技术分享        SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ‘ ASC‘, ‘‘), ‘ DESC‘, ‘‘), ‘ ‘, ‘‘)
技术分享        SET @pos1 = CHARINDEX(‘,‘, @SortColumn)
技术分享        IF @pos1 > 0
技术分享            SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
技术分享        SET @pos2 = CHARINDEX(‘.‘, @SortColumn)
技术分享        IF @pos2 > 0
技术分享        BEGIN
技术分享            SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
技术分享            IF @pos1 > 0 
技术分享                SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)
技术分享            ELSE
技术分享                SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)
技术分享        END
技术分享        ELSE
技术分享        BEGIN
技术分享            SET @SortTable = @TableNames
技术分享            SET @SortName = @SortColumn
技术分享        END
技术分享    END
技术分享    ELSE
技术分享    BEGIN
技术分享        SET @SortColumn = @PrimaryKey
技术分享        SET @SortTable = @TableNames
技术分享        SET @SortName = @SortColumn
技术分享        SET @Order = @SortColumn
技术分享        SET @Operator = ‘>=‘
技术分享    END
技术分享
技术分享    DECLARE @type varchar(50)
技术分享    DECLARE @prec int
技术分享    SELECT @type=t.name, @prec=c.prec
技术分享    FROM sysobjects o 
技术分享    JOIN syscolumns c on o.id=c.id
技术分享    JOIN systypes t on c.xusertype=t.xusertype
技术分享    WHERE o.name = @SortTable AND c.name = @SortName
技术分享    IF CHARINDEX(‘char‘, @type) > 0
技术分享    SET @type = @type + ‘(‘ + CAST(@prec AS varchar) + ‘)‘
技术分享
技术分享    DECLARE @TopRows INT
技术分享    SET @TopRows = @PageSize * @CurrentPage + 1
技术分享    print @TopRows
技术分享    print @Operator
技术分享    EXEC(‘
技术分享        DECLARE @SortColumnBegin ‘ + @type + ‘
技术分享        SET ROWCOUNT ‘ + @TopRows + ‘
技术分享        SELECT @SortColumnBegin=‘ + @SortColumn + ‘ FROM  ‘ + @TableNames + ‘ ‘ + @Filter + ‘ ‘ + @Group + ‘ ORDER BY ‘ + @Order + ‘
技术分享        SET ROWCOUNT ‘ + @PageSize + ‘
技术分享        SELECT ‘ + @Fields + ‘ FROM  ‘ + @TableNames + ‘ ‘ + @Filter  + ‘ AND ‘ + @SortColumn + ‘‘ + @Operator + ‘@SortColumnBegin ‘ + @Group + ‘ ORDER BY ‘ + @Order + ‘    
技术分享    ‘)    
技术分享END
技术分享
技术分享GO
技术分享
技术分享--调用例子:
技术分享    --1.单表/单排序
技术分享    EXEC usp_PagingLarge ‘bigtable‘,‘d_id‘,‘d_id,d_title,d_content,d_time‘,20,1,‘‘,‘‘,‘d_id desc‘
技术分享    --2.单表/多排序
技术分享    EXEC usp_PagingLarge ‘bigtable‘,‘d_id‘,‘*‘,20,0,‘‘,‘‘,‘d_time asc,d_id desc‘
技术分享    --3.多表/单排序
技术分享    EXEC usp_PagingLarge ‘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‘
技术分享    --4.多表/多排序
技术分享    EXEC usp_PagingLarge ‘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‘

 

与自定义分页结合例子:
/Files/jiny-z/Paging_Custom.rar

技术分享alter PROCEDURE SP_Pagination
技术分享/*
技术分享***************************************************************
技术分享** 分页存储过程 **
技术分享***************************************************************
技术分享参数说明:
技术分享1.Tables :表名称,视图
技术分享2.PrimaryKey :主关键字
技术分享3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
技术分享4.CurrentPage :当前页码
技术分享5.PageSize :分页尺寸
技术分享6.Fields:字段
技术分享6.Filter :过滤语句,不带Where 
技术分享7.Group :Group语句,不带Group By
技术分享8.docount: 1返回总行数,0返回列表
技术分享
技术分享***************************************************************/
技术分享(
技术分享@Tables varchar(1000),
技术分享@PrimaryKey varchar(100),
技术分享@Sort varchar(200) = NULL,
技术分享@CurrentPage int = 1,
技术分享@PageSize int = 10,
技术分享@Fields varchar(1000) = ‘*‘,
技术分享@Filter varchar(1000) = NULL,
技术分享@Group varchar(1000) = NULL,
技术分享@docount bit = 0
技术分享)
技术分享AS
技术分享/*默认排序*/
技术分享IF @Sort IS NULL OR @Sort = ‘‘
技术分享SET @Sort = @PrimaryKey
技术分享DECLARE @SortTable varchar(100)
技术分享DECLARE @SortName varchar(100)
技术分享DECLARE @strSortColumn varchar(200)
技术分享DECLARE @operator char(2)
技术分享DECLARE @type varchar(100)
技术分享DECLARE @prec int
技术分享
技术分享
技术分享/*设定排序语句.*/
技术分享IF CHARINDEX(‘DESC‘,@Sort)>0
技术分享 BEGIN
技术分享  SET @strSortColumn = REPLACE(@Sort, ‘DESC‘, ‘‘)
技术分享  SET @operator = ‘<=‘
技术分享 END
技术分享ELSE
技术分享 BEGIN
技术分享 IF CHARINDEX(‘ASC‘, @Sort) = 0
技术分享  SET @strSortColumn = REPLACE(@Sort, ‘ASC‘, ‘‘)
技术分享  SET @operator = ‘>=‘
技术分享 END
技术分享IF CHARINDEX(‘.‘, @strSortColumn) > 0
技术分享 BEGIN
技术分享  SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX(‘.‘,@strSortColumn))
技术分享  SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX(‘.‘,@strSortColumn) + 1, LEN(@strSortColumn))
技术分享 END
技术分享ELSE
技术分享 BEGIN
技术分享  SET @SortTable = @Tables
技术分享  SET @SortName = @strSortColumn
技术分享 END
技术分享
技术分享SELECT @type=t.name, @prec=c.prec
技术分享FROM sysobjects o 
技术分享JOIN syscolumns c on o.id=c.id
技术分享JOIN systypes t on c.xusertype=t.xusertype
技术分享WHERE o.name = @SortTable AND c.name = @SortName
技术分享
技术分享IF CHARINDEX(‘char‘, @type) > 0
技术分享 SET @type = @type + ‘(‘ + CAST(@prec AS varchar) + ‘)‘
技术分享
技术分享DECLARE @strPageSize varchar(50)
技术分享DECLARE @strStartRow varchar(50)
技术分享DECLARE @strFilter varchar(200)
技术分享DECLARE @strSimpleFilter varchar(200)
技术分享DECLARE @strGroup varchar(200)
技术分享
技术分享/*默认当前页*/
技术分享IF @CurrentPage < 1
技术分享 SET @CurrentPage = 1
技术分享
技术分享/*设置分页参数.*/
技术分享SET @strPageSize = CAST(@PageSize AS varchar(50))
技术分享SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
技术分享
技术分享/*筛选以及分组语句.*/
技术分享IF @Filter IS NOT NULL AND @Filter != ‘‘
技术分享 BEGIN
技术分享  SET @strFilter = ‘ WHERE ‘ + @Filter + ‘ ‘
技术分享  SET @strSimpleFilter = ‘ AND ‘ + @Filter + ‘ ‘
技术分享 END
技术分享ELSE
技术分享 BEGIN
技术分享  SET @strSimpleFilter = ‘‘
技术分享  SET @strFilter = ‘‘
技术分享 END
技术分享
技术分享IF @Group IS NOT NULL AND @Group != ‘‘
技术分享 SET @strGroup = ‘ GROUP BY ‘ + @Group + ‘ ‘
技术分享ELSE
技术分享 SET @strGroup = ‘‘
技术分享
技术分享 
技术分享
技术分享declare @cTemp NVarChar(1000)
技术分享declare @PageCount int,  @lineCount decimal
技术分享
技术分享CREATE TABLE #temp(linecount INT)
技术分享
技术分享set @cTemp = ‘insert into #temp (linecount)  select  count(*)  FROM ‘ + @Tables +  @strFilter + ‘ ‘ + @strGroup 
技术分享 
技术分享exec (@cTemp)
技术分享
技术分享select @lineCount = linecount from #temp
技术分享
技术分享drop table #temp
技术分享
技术分享
技术分享if(@docount=1)  
技术分享 begin
技术分享  select @lineCount ‘总行数‘ 
技术分享 end
技术分享else  
技术分享
技术分享begin
技术分享 
技术分享 --得到总页数
技术分享 set @PageCount = CEILING(@lineCount/@strPageSize)
技术分享 if @CurrentPage > @PageCount
技术分享  begin
技术分享   set @cTemp = ‘SELECT ‘ + @Fields + ‘ FROM ‘ + @Tables + ‘ WHERE 1>2 ‘ 
技术分享  end
技术分享 else
技术分享  begin
技术分享   
技术分享   /*执行查询语句*/
技术分享   
技术分享   set @cTemp = ‘DECLARE @SortColumn ‘ + @type + ‘
技术分享   SET ROWCOUNT ‘ + @strStartRow + ‘
技术分享   SELECT @SortColumn=‘ + @strSortColumn + ‘ FROM ‘ + @Tables + @strFilter + ‘ ‘ + @strGroup + ‘ ORDER BY ‘ + @Sort + ‘
技术分享   SET ROWCOUNT ‘ + @strPageSize + ‘
技术分享   SELECT ‘ + @Fields + ‘ FROM ‘ + @Tables + ‘ WHERE ‘ + @strSortColumn + @operator + ‘ @SortColumn ‘ + @strSimpleFilter + ‘ ‘ + @strGroup + ‘ ORDER BY ‘ + @Sort + ‘‘
技术分享   
技术分享  end
技术分享
技术分享 --print @cTemp
技术分享 EXEC(@cTemp)
技术分享end 
技术分享
技术分享-----------------------------------------------------
技术分享
技术分享

 

技术分享分页查询的方法已经很多很多,在这里我也加入成为其中一员。
技术分享      SQL Server中有一个Set Rowcount的的设置,它的意思是使命令的处理在响应指定的行数之后停止处理命令,利用这个特点,我们可以借用它来在一个千万行级数据表中实现高性能分页查询。先来说说实现方式:
技术分享      1、我们来假定Table中有一个已经建立了索引的主键字段ID(整数型),我们将按照这个字段来取数据进行分页。
技术分享      2、页的大小我们放在@PageSize中
技术分享      3、当前页号我们放在@CurrentPage中
技术分享      4、如何让记录指针快速滚动到我们要取的数据开头的那一行呢,这是关键所在!有了Set RowCount,我们就很容易实现了。
技术分享      5、如果我们成功地滚动记录指针到我们要取的数据的开头的那一行,然后我们把那一行的记录的ID字段的值记录下来,那么,利用Top和条件,我们就很容易的得到指定页的数据了。当然,有了Set RowCount,我们难道还用Top么?
技术分享      看看Set Rowcount怎么来帮我们的忙吧:
技术分享
技术分享Declare @ID int
技术分享Declare @MoveRecords int
技术分享
技术分享--@CurrentPage和@PageSize是传入参数
技术分享Set @MoveRecords=@CurrentPage * @PageSize+1
技术分享
技术分享--下面两行实现快速滚动到我们要取的数据的行,并把ID记录下来
技术分享Set Rowcount @MoveRecords
技术分享Select @ID=ID from Table1 Order by ID
技术分享
技术分享Set Rowcount @PageSize
技术分享--最恨为了减少麻烦使用*了,但是在这里为了说明方便,暂时用一下
技术分享Select * From Table1 Where ID>=@ID Order By ID
技术分享Set Rowcount 0
技术分享      大家可以试试看,在一个1千W记录的表里面,一下子方翻页到第100页(每页100条),看看有多快!
技术分享

 

技术分享分享]千万数量级分页存储过程(带效果演示)
技术分享效果演示:http://www.cn5135.com/_App/Opportunities/QueryResult.aspx
技术分享
技术分享CREATE PROCEDURE CN5135_SP_Pagination
技术分享/*
技术分享***************************************************************
技术分享** 千万数量级分页存储过程 **
技术分享***************************************************************
技术分享参数说明:
技术分享1.Tables :表名称,视图
技术分享2.PrimaryKey :主关键字
技术分享3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
技术分享4.CurrentPage :当前页码
技术分享5.PageSize :分页尺寸
技术分享6.Filter :过滤语句,不带Where 
技术分享7.Group :Group语句,不带Group By
技术分享效果演示:http://www.cn5135.com/_App/Opportunities/QueryResult.aspx
技术分享***************************************************************/
技术分享(
技术分享@Tables varchar(1000),
技术分享@PrimaryKey varchar(100),
技术分享@Sort varchar(200) = NULL,
技术分享@CurrentPage int = 1,
技术分享@PageSize int = 10,
技术分享@Fields varchar(1000) = ‘*‘,
技术分享@Filter varchar(1000) = NULL,
技术分享@Group varchar(1000) = NULL
技术分享)
技术分享AS
技术分享/*默认排序*/
技术分享IF @Sort IS NULL OR @Sort = ‘‘
技术分享SET @Sort = @PrimaryKey
技术分享DECLARE @SortTable varchar(100)
技术分享DECLARE @SortName varchar(100)
技术分享DECLARE @strSortColumn varchar(200)
技术分享DECLARE @operator char(2)
技术分享DECLARE @type varchar(100)
技术分享DECLARE @prec int
技术分享/*设定排序语句.*/
技术分享IF CHARINDEX(‘DESC‘,@Sort)>0
技术分享BEGIN
技术分享SET @strSortColumn = REPLACE(@Sort, ‘DESC‘, ‘‘)
技术分享SET @operator = ‘<=‘
技术分享END
技术分享ELSE
技术分享BEGIN
技术分享IF CHARINDEX(‘ASC‘, @Sort) = 0
技术分享SET @strSortColumn = REPLACE(@Sort, ‘ASC‘, ‘‘)
技术分享SET @operator = ‘>=‘
技术分享END
技术分享IF CHARINDEX(‘.‘, @strSortColumn) > 0
技术分享BEGIN
技术分享SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX(‘.‘,@strSortColumn))
技术分享SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX(‘.‘,@strSortColumn) + 1, LEN(@strSortColumn))
技术分享END
技术分享ELSE
技术分享BEGIN
技术分享SET @SortTable = @Tables
技术分享SET @SortName = @strSortColumn
技术分享END
技术分享SELECT @type=t.name, @prec=c.prec
技术分享FROM sysobjects o 
技术分享JOIN syscolumns c on o.id=c.id
技术分享JOIN systypes t on c.xusertype=t.xusertype
技术分享WHERE o.name = @SortTable AND c.name = @SortName
技术分享IF CHARINDEX(‘char‘, @type) > 0
技术分享SET @type = @type + ‘(‘ + CAST(@prec AS varchar) + ‘)‘
技术分享DECLARE @strPageSize varchar(50)
技术分享DECLARE @strStartRow varchar(50)
技术分享DECLARE @strFilter varchar(1000)
技术分享DECLARE @strSimpleFilter varchar(1000)
技术分享DECLARE @strGroup varchar(1000)
技术分享/*默认当前页*/
技术分享IF @CurrentPage < 1
技术分享SET @CurrentPage = 1
技术分享/*设置分页参数.*/
技术分享SET @strPageSize = CAST(@PageSize AS varchar(50))
技术分享SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
技术分享/*筛选以及分组语句.*/
技术分享IF @Filter IS NOT NULL AND @Filter != ‘‘
技术分享BEGIN
技术分享SET @strFilter = ‘ WHERE ‘ + @Filter + ‘ ‘
技术分享SET @strSimpleFilter = ‘ AND ‘ + @Filter + ‘ ‘
技术分享END
技术分享ELSE
技术分享BEGIN
技术分享SET @strSimpleFilter = ‘‘
技术分享SET @strFilter = ‘‘
技术分享END
技术分享IF @Group IS NOT NULL AND @Group != ‘‘
技术分享SET @strGroup = ‘ GROUP BY ‘ + @Group + ‘ ‘
技术分享ELSE
技术分享SET @strGroup = ‘‘
技术分享/*执行查询语句*/
技术分享EXEC(
技术分享
技术分享DECLARE @SortColumn ‘ + @type + ‘
技术分享SET ROWCOUNT ‘ + @strStartRow + ‘
技术分享SELECT @SortColumn=‘ + @strSortColumn + ‘ FROM ‘ + @Tables + @strFilter + ‘ ‘ + @strGroup + ‘ ORDER BY ‘ + @Sort + ‘
技术分享SET ROWCOUNT ‘ + @strPageSize + ‘
技术分享SELECT ‘ + @Fields + ‘ FROM ‘ + @Tables + ‘ WHERE ‘ + @strSortColumn + @operator + ‘ @SortColumn ‘ + @strSimpleFilter + ‘ ‘ + @strGroup + ‘ ORDER BY ‘ + @Sort + ‘
技术分享
技术分享)
技术分享GO

 

 

注:
     1)如表名参数为多表连接时,sort列必须指定表名;
     2)只支持单字段排序,有朋友如果问为什么不做成可以多字段排序的,理论上确实有这种可能性,但需要以一定的效率损失为代价,而且会使方法过于复杂,如真有这种需要,完全可以写一个单独的分页存储过程,无论在性能还是复杂度上都比通用要简单.
     3) 对非unique字段排序的支持,但必须设定一个PK字段(注:只要是unique字段都可以作为pk字段)


  1技术分享if exists (select * from dbo.sysobjects where id = object_id(N‘[dbo].[Paging_RowCount]‘) and OBJECTPROPERTY(id, N‘IsProcedure‘) = 1)
  2技术分享drop procedure [dbo].[Paging_RowCount]
  3技术分享GO
  4技术分享
  5技术分享SET QUOTED_IDENTIFIER ON 
  6技术分享GO
  7技术分享SET ANSI_NULLS ON 
  8技术分享GO
  9技术分享---------------------------------------------------------------
 10技术分享-- 分页存储过程(使用RowCount)  --edit by SiBen
 11技术分享-- summary:
 12技术分享--          获取表或表集合的分页数据
 13技术分享--          当多表连接时,sort列必须指定表名
 14技术分享---------------------------------------------------------------
 15技术分享
 16技术分享CREATE PROCEDURE Paging_RowCount
 17技术分享(
 18技术分享@Tables varchar(1000),
 19技术分享@PK varchar(100),
 20技术分享@Sort varchar(200) = NULL,
 21技术分享@PageNumber int = 1,
 22技术分享@PageSize int = 10,
 23技术分享@Fields varchar(1000) = ‘*‘,
 24技术分享@Filter varchar(1000) = NULL,
 25技术分享@Group varchar(1000) = NULL,
 26技术分享@RecordCount int = 0 output 
 27技术分享)
 28技术分享AS
 29技术分享
 30技术分享/*Default Sorting*/
 31技术分享IF @Sort IS NULL OR @Sort = ‘‘
 32技术分享    SET @Sort = @PK
 33技术分享
 34技术分享/*Find the @PK type*/
 35技术分享DECLARE @SortTable varchar(100)
 36技术分享DECLARE @SortName varchar(100)
 37技术分享DECLARE @strSortColumn varchar(200)
 38技术分享DECLARE @operator char(2)
 39技术分享DECLARE @type varchar(100)
 40技术分享DECLARE @prec int
 41技术分享
 42技术分享/*Set sorting variables.*/    
 43技术分享IF CHARINDEX(‘DESC‘,@Sort)>0
 44技术分享    BEGIN
 45技术分享        SET @strSortColumn = REPLACE(@Sort, ‘DESC‘, ‘‘)
 46技术分享        SET @operator = ‘<‘
 47技术分享    END
 48技术分享ELSE
 49技术分享    BEGIN
 50技术分享        IF CHARINDEX(‘ASC‘, @Sort) > 0
 51技术分享            SET @strSortColumn = REPLACE(@Sort, ‘ASC‘, ‘‘)
 52技术分享                ELSE
 53技术分享                        SET @strSortColumn = @Sort
 54技术分享
 55技术分享        SET @operator = ‘>‘
 56技术分享    END
 57技术分享
 58技术分享
 59技术分享IF CHARINDEX(‘.‘, @strSortColumn) > 0
 60技术分享    BEGIN
 61技术分享        SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX(‘.‘,@strSortColumn))
 62技术分享        SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX(‘.‘,@strSortColumn) + 1, LEN(@strSortColumn))
 63技术分享    END
 64技术分享ELSE
 65技术分享    BEGIN
 66技术分享        SET @SortTable = @Tables
 67技术分享        SET @SortName = @strSortColumn
 68技术分享    END
 69技术分享
 70技术分享SELECT @type=t.name, @prec=c.prec
 71技术分享FROM sysobjects o 
 72技术分享JOIN syscolumns c on o.id=c.id
 73技术分享JOIN systypes t on c.xusertype=t.xusertype
 74技术分享WHERE o.name = @SortTable AND c.name = @SortName
 75技术分享
 76技术分享IF CHARINDEX(‘char‘, @type) > 0
 77技术分享   SET @type = @type + ‘(‘ + CAST(@prec AS varchar) + ‘)‘
 78技术分享
 79技术分享DECLARE @strPageSize varchar(50)
 80技术分享DECLARE @strStartRow varchar(50)
 81技术分享DECLARE @strFilter varchar(1000)
 82技术分享DECLARE @strSimpleFilter varchar(1000)
 83技术分享DECLARE @strGroup varchar(1000)
 84技术分享
 85技术分享/*Default Page Number*/
 86技术分享IF @PageNumber < 1
 87技术分享    SET @PageNumber = 1
 88技术分享
 89技术分享/*Set paging variables.*/
 90技术分享SET @strPageSize = CAST(@PageSize AS varchar(50))
 91技术分享SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1) AS varchar(50))
 92技术分享
 93技术分享/*Set filter & group variables.*/
 94技术分享IF @Filter IS NOT NULL AND @Filter != ‘‘
 95技术分享    BEGIN
 96技术分享        SET @strFilter = ‘ WHERE ‘ + @Filter + ‘ ‘
 97技术分享        SET @strSimpleFilter = ‘ AND ‘ + @Filter + ‘ ‘
 98技术分享    END
 99技术分享ELSE
100技术分享    BEGIN
101技术分享        SET @strSimpleFilter = ‘‘
102技术分享        SET @strFilter = ‘‘
103技术分享    END
104技术分享IF @Group IS NOT NULL AND @Group != ‘‘
105技术分享    SET @strGroup = ‘ GROUP BY ‘ + @Group + ‘ ‘
106技术分享ELSE
107技术分享    SET @strGroup = ‘‘
108技术分享
109技术分享/*Get rows count.*/
110技术分享DECLARE @str_Count_SQL nvarchar(500)
111技术分享SET @str_Count_SQL= ‘SELECT @TotalCount=count(*) FROM ‘ + @Tables + @strFilter
112技术分享EXEC sp_executesql @str_Count_SQL,N‘@TotalCount int=0 output‘,@RecordCount output
113技术分享    
114技术分享/*Execute dynamic query*/    
115技术分享IF @Sort = @PK
116技术分享    BEGIN
117技术分享        EXEC(
118技术分享        ‘
119技术分享        DECLARE @SortColumn ‘ + @type + ‘
120技术分享        SET ROWCOUNT ‘ + @strStartRow + ‘
121技术分享        SELECT @SortColumn=‘ + @strSortColumn + ‘ FROM ‘ + @Tables + @strFilter + ‘ ‘ + @strGroup + ‘ ORDER BY ‘ + @Sort + ‘
122技术分享        SET ROWCOUNT ‘ + @strPageSize + ‘
123技术分享        SELECT ‘ + @Fields + ‘ FROM ‘ + @Tables + ‘ WHERE ‘ + @strSortColumn + @operator + ‘= @SortColumn ‘ + @strSimpleFilter + ‘ ‘ + @strGroup + ‘ ORDER BY ‘ + @Sort + ‘
124技术分享        ‘
125技术分享        )
126技术分享    END
127技术分享ELSE
128技术分享    BEGIN
129技术分享        EXEC(
130技术分享        ‘
131技术分享        DECLARE @SortColumn ‘ + @type + ‘
132技术分享        DECLARE @SortNullValue ‘ + @type + ‘
133技术分享        DECLARE @PKStartValue int
134技术分享        SET @SortNullValue=CAST(‘‘‘‘ as ‘+ @type +‘)
135技术分享        SET ROWCOUNT ‘ + @strStartRow + ‘
136技术分享        SELECT @SortColumn= isNull(‘ + @strSortColumn + ‘,@SortNullValue), @PKStartValue = ‘+ @PK +‘ FROM ‘ + @Tables + @strFilter + ‘ ‘ + @strGroup + ‘ ORDER BY ‘ + @Sort + ‘,‘+ @PK +‘ Desc 
137技术分享        SET ROWCOUNT ‘ + @strPageSize + ‘
138技术分享        SELECT ‘ + @Fields + ‘ FROM ‘ + @Tables + ‘ WHERE (isNull(‘ + @strSortColumn+‘,@SortNullValue)‘ + @operator + ‘ @SortColumn or (isNull(‘ + @strSortColumn+‘,@SortNullValue)=@SortColumn and ‘+ @PK +‘<=@PKStartValue))‘ + @strSimpleFilter + ‘ ‘ + @strGroup + ‘ ORDER BY ‘ + @Sort + ‘,‘+ @PK +‘ Desc
139技术分享        ‘
140技术分享        )
141技术分享    END
142技术分享GO
143技术分享SET QUOTED_IDENTIFIER OFF 
144技术分享GO
145技术分享SET ANSI_NULLS ON 
146技术分享GO
147技术分享
148技术分享

http://www.codeproject.com/aspnet/PagingLarge.asp 

技术分享邹建的存储过程
技术分享ALTER PROC PageView
技术分享@tbname     sysname,           --要分页显示的表名
技术分享@FieldKey   sysname,           --用于定位记录的主键(惟一键)字段,只能是单个字段
技术分享@PageCurrent int=1,             --要显示的页码
技术分享@PageSize   int=10,            --每页的大小(记录数)
技术分享@FieldShow  nvarchar(1000)=‘‘,  --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
技术分享@FieldOrder  nvarchar(1000)=‘‘, --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
技术分享                                          --用于指定排序顺序
技术分享@Where     nvarchar(1000)=‘‘,  --查询条件
技术分享@PageCount  int OUTPUT        --总页数
技术分享AS
技术分享DECLARE @sql nvarchar(4000)
技术分享SET NOCOUNT ON
技术分享--检查对象是否有效
技术分享IF OBJECT_ID(@tbname) IS NULL
技术分享BEGIN
技术分享RAISERROR(N‘对象"%s"不存在‘,1,16,@tbname)
技术分享RETURN
技术分享END
技术分享IF OBJECTPROPERTY(OBJECT_ID(@tbname),N‘IsTable‘)=0
技术分享AND OBJECTPROPERTY(OBJECT_ID(@tbname),N‘IsView‘)=0
技术分享AND OBJECTPROPERTY(OBJECT_ID(@tbname),N‘IsTableFunction‘)=0
技术分享BEGIN
技术分享RAISERROR(N‘"%s"不是表、视图或者表值函数‘,1,16,@tbname)
技术分享RETURN
技术分享END
技术分享
技术分享--分页字段检查
技术分享IF ISNULL(@FieldKey,N‘‘)=‘‘
技术分享BEGIN
技术分享RAISERROR(N‘分页处理需要主键(或者惟一键)‘,1,16)
技术分享RETURN
技术分享END
技术分享
技术分享--其他参数检查及规范
技术分享IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
技术分享IF ISNULL(@PageSize,0)<1 SET @PageSize=10
技术分享IF ISNULL(@FieldShow,N‘‘)=N‘‘ SET @FieldShow=N‘*‘
技术分享IF ISNULL(@FieldOrder,N‘‘)=N‘‘
技术分享SET @FieldOrder=N‘‘
技术分享ELSE
技术分享SET @FieldOrder=N‘ORDER BY ‘+LTRIM(@FieldOrder)
技术分享IF ISNULL(@Where,N‘‘)=N‘‘
技术分享SET @Where=N‘‘
技术分享ELSE
技术分享SET @Where=N‘WHERE (‘+@Where+N‘)‘
技术分享
技术分享--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
技术分享IF @PageCount IS NULL
技术分享BEGIN
技术分享SET @sql=N‘SELECT @PageCount=COUNT(*)‘
技术分享+N‘ FROM ‘+@tbname
技术分享+N‘ ‘+@Where
技术分享EXEC sp_executesql @sql,N‘@PageCount int OUTPUT‘,@PageCount OUTPUT
技术分享SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
技术分享END
技术分享
技术分享--计算分页显示的TOPN值
技术分享DECLARE @TopN varchar(20),@TopN1 varchar(20)
技术分享SELECT @TopN=@PageSize,
技术分享@TopN1=@PageCurrent*@PageSize
技术分享
技术分享--第一页直接显示
技术分享IF @PageCurrent=1
技术分享EXEC(N‘SELECT TOP ‘+@TopN
技术分享+N‘ ‘+@FieldShow
技术分享+N‘ FROM ‘+@tbname
技术分享+N‘ ‘+@Where
技术分享+N‘ ‘+@FieldOrder)
技术分享ELSE
技术分享BEGIN
技术分享SELECT @PageCurrent=@TopN1,
技术分享@sql=N‘SELECT @n=@n-1,@s=CASE WHEN @n<‘+@TopN
技术分享+N‘ THEN @s+N‘‘,‘‘+QUOTENAME(RTRIM(CAST(‘+@FieldKey
技术分享+N‘ as varchar(8000))),N‘‘‘‘‘‘‘‘) ELSE N‘‘‘‘ END FROM ‘+@tbname
技术分享+N‘ ‘+@Where
技术分享+N‘ ‘+@FieldOrder
技术分享SET ROWCOUNT @PageCurrent
技术分享EXEC sp_executesql @sql,
技术分享N‘@n int,@s nvarchar(4000) OUTPUT‘,
技术分享@PageCurrent,@sql OUTPUT
技术分享SET ROWCOUNT 0
技术分享IF @sql=N‘‘
技术分享EXEC(N‘SELECT TOP 0‘
技术分享+N‘ ‘+@FieldShow
技术分享+N‘ FROM ‘+@tbname)
技术分享ELSE
技术分享BEGIN
技术分享SET @sql=STUFF(@sql,1,1,N‘‘)
技术分享--执行查询
技术分享EXEC(N‘SELECT TOP ‘+@TopN
技术分享+N‘ ‘+@FieldShow
技术分享+N‘ FROM ‘+@tbname
技术分享+N‘ WHERE ‘+@FieldKey
技术分享+N‘ IN(‘+@sql
技术分享+N‘) ‘+@FieldOrder)
技术分享END
技术分享END

 

存储过程分页(一)

标签:

原文地址:http://www.cnblogs.com/weihengblogs/p/4476037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!