分页存储过程

简介:

ExpandedBlockStart.gif ContractedBlock.gif /**/ /**/ /**/ /*
InBlock.gif说明:1.支持多表查询 2.支持任意排序 3.不支持表别名
InBlock.gif参考了
InBlock.gif evafly920:[分享]千万数量级分页存储过程(效果演示)
InBlock.gif 地址:http://blog.csdn.net/evafly920/archive/2006/03/03/614813.aspx
InBlock.gif
InBlock.gifIF(EXISTS(SELECT * FROM sysobjects WHERE [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))
InBlock.gif DROP PROCEDURE usp_PagingLarge
ExpandedBlockEnd.gif
*/

None.gif
None.gif GO
None.gif
None.gif CREATE PROCEDURE usp_PagingLarge
None.gif @TableNames VARCHAR( 200), -- 表名,可以是多个表,但不能用别名
None.gif
@PrimaryKey VARCHAR( 100), -- 主键,可以为空,但@Order为空时该值不能为空
None.gif
@Fields VARCHAR( 200), -- 要取出的字段,可以是多个表的字段,可以为空,为空表示select *
None.gif
@PageSize INT, -- 每页记录数
None.gif
@CurrentPage INT, -- 当前页,0表示第1页
None.gif
@Filter VARCHAR( 200) = '', -- 条件,可以为空,不用填 where
None.gif
@Group VARCHAR( 200) = '', -- 分组依据,可以为空,不用填 group by
None.gif
@Order VARCHAR( 200) = '' -- 排序,可以为空,为空默认按主键升序排列,不用填 order by
None.gif
AS
None.gif BEGIN
None.gif DECLARE @SortColumn VARCHAR( 200)
None.gif DECLARE @Operator CHAR( 2)
None.gif DECLARE @SortTable VARCHAR( 200)
None.gif DECLARE @SortName VARCHAR( 200)
None.gif IF @Fields = ''
None.gif SET @Fields = ' * '
None.gif IF @Filter = ''
None.gif SET @Filter = ' WHERE 1=1 '
None.gif ELSE
None.gif SET @Filter = ' WHERE ' + @Filter
None.gif IF @Group <> ''
None.gif SET @Group = ' GROUP BY ' + @Group
None.gif
None.gif IF @Order <> ''
None.gif BEGIN
None.gif DECLARE @pos1 INT, @pos2 INT
None.gif SET @Order = REPLACE( REPLACE( @Order, ' asc ', ' ASC '), ' desc ', ' DESC ')
None.gif IF CHARINDEX( ' DESC ', @Order) > 0
None.gif IF CHARINDEX( ' ASC ', @Order) > 0
None.gif BEGIN
None.gif IF CHARINDEX( ' DESC ', @Order) < CHARINDEX( ' ASC ', @Order)
None.gif SET @Operator = ' <= '
None.gif ELSE
None.gif SET @Operator = ' >= '
None.gif END
None.gif ELSE
None.gif SET @Operator = ' <= '
None.gif ELSE
None.gif SET @Operator = ' >= '
None.gif SET @SortColumn = REPLACE( REPLACE( REPLACE( @Order, ' ASC ', ''), ' DESC ', ''), ' ', '')
None.gif SET @pos1 = CHARINDEX( ' , ', @SortColumn)
None.gif IF @pos1 > 0
None.gif SET @SortColumn = SUBSTRING( @SortColumn, 1, @pos1 - 1)
None.gif SET @pos2 = CHARINDEX( ' . ', @SortColumn)
None.gif IF @pos2 > 0
None.gif BEGIN
None.gif SET @SortTable = SUBSTRING( @SortColumn, 1, @pos2 - 1)
None.gif IF @pos1 > 0
None.gif SET @SortName = SUBSTRING( @SortColumn, @pos2 + 1, @pos1 - @pos2 - 1)
None.gif ELSE
None.gif SET @SortName = SUBSTRING( @SortColumn, @pos2 + 1, LEN( @SortColumn) - @pos2)
None.gif END
None.gif ELSE
None.gif BEGIN
None.gif SET @SortTable = @TableNames
None.gif SET @SortName = @SortColumn
None.gif END
None.gif END
None.gif ELSE
None.gif BEGIN
None.gif SET @SortColumn = @PrimaryKey
None.gif SET @SortTable = @TableNames
None.gif SET @SortName = @SortColumn
None.gif SET @Order = @SortColumn
None.gif SET @Operator = ' >= '
None.gif END
None.gif
None.gif DECLARE @type varchar( 50)
None.gif DECLARE @prec int
None.gif SELECT @type =t.name, @prec =c.prec
None.gif FROM sysobjects o
None.gif JOIN syscolumns c on o.id =c.id
None.gif JOIN systypes t on c.xusertype =t.xusertype
None.gif WHERE o.name = @SortTable AND c.name = @SortName
None.gif IF CHARINDEX( ' char ', @type) > 0
None.gif SET @type = @type + ' ( ' + CAST( @prec AS varchar) + ' ) '
None.gif
None.gif DECLARE @TopRows INT
None.gif SET @TopRows = @PageSize * @CurrentPage + 1
None.gif print @TopRows
None.gif print @Operator
None.gif EXEC( '
None.gif DECLARE @SortColumnBegin
' + @type + '
None.gif SET ROWCOUNT
' + @TopRows + '
None.gif SELECT @SortColumnBegin=
' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + '
None.gif SET ROWCOUNT
' + @PageSize + '
None.gif SELECT
' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + ' @SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + '
None.gif
')
None.gif END
None.gif
None.gif GO
None.gif
None.gif -- 调用例子:
None.gif
-- 1.单表/单排序
None.gif
EXEC usp_PagingLarge ' bigtable ', ' d_id ', ' d_id,d_title,d_content,d_time ', 20, 1, '', '', ' d_id desc '
None.gif -- 2.单表/多排序
None.gif
EXEC usp_PagingLarge ' bigtable ', ' d_id ', ' * ', 20, 0, '', '', ' d_time asc,d_id desc '
None.gif -- 3.多表/单排序
None.gif
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 '
None.gif -- 4.多表/多排序
None.gif
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
None.gif alter PROCEDURE SP_Pagination
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
InBlock.gif***************************************************************
InBlock.gif** 分页存储过程 **
InBlock.gif***************************************************************
InBlock.gif参数说明:
InBlock.gif1.Tables :表名称,视图
InBlock.gif2.PrimaryKey :主关键字
InBlock.gif3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
InBlock.gif4.CurrentPage :当前页码
InBlock.gif5.PageSize :分页尺寸
InBlock.gif6.Fields:字段
InBlock.gif6.Filter :过滤语句,不带Where
InBlock.gif7.Group :Group语句,不带Group By
InBlock.gif8.docount: 1返回总行数,0返回列表
InBlock.gif
ExpandedBlockEnd.gif**************************************************************
*/

None.gif(
None.gif @Tables varchar( 1000),
None.gif @PrimaryKey varchar( 100),
None.gif @Sort varchar( 200) = NULL,
None.gif @CurrentPage int = 1,
None.gif @PageSize int = 10,
None.gif @Fields varchar( 1000) = ' * ',
None.gif @Filter varchar( 1000) = NULL,
None.gif @Group varchar( 1000) = NULL,
None.gif @docount bit = 0
None.gif)
None.gif AS
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*默认排序*/
None.gif IF @Sort IS NULL OR @Sort = ''
None.gif SET @Sort = @PrimaryKey
None.gif DECLARE @SortTable varchar( 100)
None.gif DECLARE @SortName varchar( 100)
None.gif DECLARE @strSortColumn varchar( 200)
None.gif DECLARE @operator char( 2)
None.gif DECLARE @type varchar( 100)
None.gif DECLARE @prec int
None.gif
None.gif
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*设定排序语句.*/
None.gif IF CHARINDEX( ' DESC ', @Sort) > 0
None.gif BEGIN
None.gif SET @strSortColumn = REPLACE( @Sort, ' DESC ', '')
None.gif SET @operator = ' <= '
None.gif END
None.gif ELSE
None.gif BEGIN
None.gif IF CHARINDEX( ' ASC ', @Sort) = 0
None.gif SET @strSortColumn = REPLACE( @Sort, ' ASC ', '')
None.gif SET @operator = ' >= '
None.gif END
None.gif IF CHARINDEX( ' . ', @strSortColumn) > 0
None.gif BEGIN
None.gif SET @SortTable = SUBSTRING( @strSortColumn, 0, CHARINDEX( ' . ', @strSortColumn))
None.gif SET @SortName = SUBSTRING( @strSortColumn, CHARINDEX( ' . ', @strSortColumn) + 1, LEN( @strSortColumn))
None.gif END
None.gif ELSE
None.gif BEGIN
None.gif SET @SortTable = @Tables
None.gif SET @SortName = @strSortColumn
None.gif END
None.gif
None.gif SELECT @type =t.name, @prec =c.prec
None.gif FROM sysobjects o
None.gif JOIN syscolumns c on o.id =c.id
None.gif JOIN systypes t on c.xusertype =t.xusertype
None.gif WHERE o.name = @SortTable AND c.name = @SortName
None.gif
None.gif IF CHARINDEX( ' char ', @type) > 0
None.gif SET @type = @type + ' ( ' + CAST( @prec AS varchar) + ' ) '
None.gif
None.gif DECLARE @strPageSize varchar( 50)
None.gif DECLARE @strStartRow varchar( 50)
None.gif DECLARE @strFilter varchar( 200)
None.gif DECLARE @strSimpleFilter varchar( 200)
None.gif DECLARE @strGroup varchar( 200)
None.gif
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*默认当前页*/
None.gif IF @CurrentPage < 1
None.gif SET @CurrentPage = 1
None.gif
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*设置分页参数.*/
None.gif SET @strPageSize = CAST( @PageSize AS varchar( 50))
None.gif SET @strStartRow = CAST((( @CurrentPage - 1) * @PageSize + 1) AS varchar( 50))
None.gif
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*筛选以及分组语句.*/
None.gif IF @Filter IS NOT NULL AND @Filter != ''
None.gif BEGIN
None.gif SET @strFilter = ' WHERE ' + @Filter + ' '
None.gif SET @strSimpleFilter = ' AND ' + @Filter + ' '
None.gif END
None.gif ELSE
None.gif BEGIN
None.gif SET @strSimpleFilter = ''
None.gif SET @strFilter = ''
None.gif END
None.gif
None.gif IF @Group IS NOT NULL AND @Group != ''
None.gif SET @strGroup = ' GROUP BY ' + @Group + ' '
None.gif ELSE
None.gif SET @strGroup = ''
None.gif
None.gif
None.gif
None.gif declare @cTemp NVarChar( 1000)
None.gif declare @PageCount int, @lineCount decimal
None.gif
None.gif CREATE TABLE # temp(linecount INT)
None.gif
None.gif set @cTemp = ' insert into #temp (linecount) select count(*) FROM ' + @Tables + @strFilter + ' ' + @strGroup
None.gif
None.gif exec ( @cTemp)
None.gif
None.gif select @lineCount = linecount from # temp
None.gif
None.gif drop table # temp
None.gif
None.gif
None.gif if( @docount = 1)
None.gif begin
None.gif select @lineCount ' 总行数 '
None.gif end
None.gif else
None.gif
None.gif begin
None.gif
None.gif -- 得到总页数
None.gif
set @PageCount = CEILING( @lineCount / @strPageSize)
None.gif if @CurrentPage > @PageCount
None.gif begin
None.gif set @cTemp = ' SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE 1>2 '
None.gif end
None.gif else
None.gif begin
None.gif
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*执行查询语句*/
None.gif
None.gif set @cTemp = ' DECLARE @SortColumn ' + @type + '
None.gif SET ROWCOUNT
' + @strStartRow + '
None.gif SELECT @SortColumn=
' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
None.gif SET ROWCOUNT
' + @strPageSize + '
None.gif SELECT
' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ''
None.gif
None.gif end
None.gif
None.gif -- print @cTemp
None.gif
EXEC( @cTemp)
None.gif end
None.gif
None.gif -- ---------------------------------------------------
None.gif

None.gif

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

None.gif分享]千万数量级分页存储过程(带效果演示)
None.gif效果演示:http: //www.cn5135.com /_App /Opportunities /QueryResult.aspx
None.gif
None.gif CREATE PROCEDURE CN5135_SP_Pagination
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
InBlock.gif***************************************************************
InBlock.gif** 千万数量级分页存储过程 **
InBlock.gif***************************************************************
InBlock.gif参数说明:
InBlock.gif1.Tables :表名称,视图
InBlock.gif2.PrimaryKey :主关键字
InBlock.gif3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
InBlock.gif4.CurrentPage :当前页码
InBlock.gif5.PageSize :分页尺寸
InBlock.gif6.Filter :过滤语句,不带Where
InBlock.gif7.Group :Group语句,不带Group By
InBlock.gif效果演示:http://www.cn5135.com/_App/Opportunities/QueryResult.aspx
ExpandedBlockEnd.gif**************************************************************
*/

None.gif(
None.gif @Tables varchar( 1000),
None.gif @PrimaryKey varchar( 100),
None.gif @Sort varchar( 200) = NULL,
None.gif @CurrentPage int = 1,
None.gif @PageSize int = 10,
None.gif @Fields varchar( 1000) = ' * ',
None.gif @Filter varchar( 1000) = NULL,
None.gif @Group varchar( 1000) = NULL
None.gif)
None.gif AS
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*默认排序*/
None.gif IF @Sort IS NULL OR @Sort = ''
None.gif SET @Sort = @PrimaryKey
None.gif DECLARE @SortTable varchar( 100)
None.gif DECLARE @SortName varchar( 100)
None.gif DECLARE @strSortColumn varchar( 200)
None.gif DECLARE @operator char( 2)
None.gif DECLARE @type varchar( 100)
None.gif DECLARE @prec int
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*设定排序语句.*/
None.gif IF CHARINDEX( ' DESC ', @Sort) > 0
None.gif BEGIN
None.gif SET @strSortColumn = REPLACE( @Sort, ' DESC ', '')
None.gif SET @operator = ' <= '
None.gif END
None.gif ELSE
None.gif BEGIN
None.gif IF CHARINDEX( ' ASC ', @Sort) = 0
None.gif SET @strSortColumn = REPLACE( @Sort, ' ASC ', '')
None.gif SET @operator = ' >= '
None.gif END
None.gif IF CHARINDEX( ' . ', @strSortColumn) > 0
None.gif BEGIN
None.gif SET @SortTable = SUBSTRING( @strSortColumn, 0, CHARINDEX( ' . ', @strSortColumn))
None.gif SET @SortName = SUBSTRING( @strSortColumn, CHARINDEX( ' . ', @strSortColumn) + 1, LEN( @strSortColumn))
None.gif END
None.gif ELSE
None.gif BEGIN
None.gif SET @SortTable = @Tables
None.gif SET @SortName = @strSortColumn
None.gif END
None.gif SELECT @type =t.name, @prec =c.prec
None.gif FROM sysobjects o
None.gif JOIN syscolumns c on o.id =c.id
None.gif JOIN systypes t on c.xusertype =t.xusertype
None.gif WHERE o.name = @SortTable AND c.name = @SortName
None.gif IF CHARINDEX( ' char ', @type) > 0
None.gif SET @type = @type + ' ( ' + CAST( @prec AS varchar) + ' ) '
None.gif DECLARE @strPageSize varchar( 50)
None.gif DECLARE @strStartRow varchar( 50)
None.gif DECLARE @strFilter varchar( 1000)
None.gif DECLARE @strSimpleFilter varchar( 1000)
None.gif DECLARE @strGroup varchar( 1000)
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*默认当前页*/
None.gif IF @CurrentPage < 1
None.gif SET @CurrentPage = 1
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*设置分页参数.*/
None.gif SET @strPageSize = CAST( @PageSize AS varchar( 50))
None.gif SET @strStartRow = CAST((( @CurrentPage - 1) * @PageSize + 1) AS varchar( 50))
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*筛选以及分组语句.*/
None.gif IF @Filter IS NOT NULL AND @Filter != ''
None.gif BEGIN
None.gif SET @strFilter = ' WHERE ' + @Filter + ' '
None.gif SET @strSimpleFilter = ' AND ' + @Filter + ' '
None.gif END
None.gif ELSE
None.gif BEGIN
None.gif SET @strSimpleFilter = ''
None.gif SET @strFilter = ''
None.gif END
None.gif IF @Group IS NOT NULL AND @Group != ''
None.gif SET @strGroup = ' GROUP BY ' + @Group + ' '
None.gif ELSE
None.gif SET @strGroup = ''
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*执行查询语句*/
None.gif EXEC(
None.gif '
None.gifDECLARE @SortColumn
' + @type + '
None.gifSET ROWCOUNT
' + @strStartRow + '
None.gifSELECT @SortColumn=
' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
None.gifSET ROWCOUNT
' + @strPageSize + '
None.gifSELECT
' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
None.gif
'
None.gif)
None.gif GO

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


1 None.gif if exists ( select * from dbo.sysobjects where id = object_id(N ' [dbo].[Paging_RowCount] ') and OBJECTPROPERTY(id, N ' IsProcedure ') = 1)
2 None.gif drop procedure [ dbo ]. [ Paging_RowCount ]
3 None.gif GO
4 None.gif
5 None.gif SET QUOTED_IDENTIFIER ON
6 None.gif GO
7 None.gif SET ANSI_NULLS ON
8 None.gif GO
9 None.gif -- -------------------------------------------------------------
10 None.gif-- 分页存储过程(使用RowCount) --edit by SiBen
11 None.gif-- summary:
12 None.gif-- 获取表或表集合的分页数据
13 None.gif-- 当多表连接时,sort列必须指定表名
14 None.gif-- -------------------------------------------------------------
15 None.gif
16 None.gif CREATE PROCEDURE Paging_RowCount
17 None.gif(
18 None.gif @Tables varchar( 1000),
19 None.gif @PK varchar( 100),
20 None.gif @Sort varchar( 200) = NULL,
21 None.gif @PageNumber int = 1,
22 None.gif @PageSize int = 10,
23 None.gif @Fields varchar( 1000) = ' * ',
24 None.gif @Filter varchar( 1000) = NULL,
25 None.gif @Group varchar( 1000) = NULL,
26 None.gif @RecordCount int = 0 output
27 None.gif)
28 None.gif AS
29 None.gif
30 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*Default Sorting*/
31 None.gif IF @Sort IS NULL OR @Sort = ''
32 None.gif SET @Sort = @PK
33 None.gif
34 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*Find the @PK type*/
35 None.gif DECLARE @SortTable varchar( 100)
36 None.gif DECLARE @SortName varchar( 100)
37 None.gif DECLARE @strSortColumn varchar( 200)
38 None.gif DECLARE @operator char( 2)
39 None.gif DECLARE @type varchar( 100)
40 None.gif DECLARE @prec int
41 None.gif
42 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*Set sorting variables.*/
43 None.gif IF CHARINDEX( ' DESC ', @Sort) > 0
44 None.gif BEGIN
45 None.gif SET @strSortColumn = REPLACE( @Sort, ' DESC ', '')
46 None.gif SET @operator = ' < '
47 None.gif END
48 None.gif ELSE
49 None.gif BEGIN
50 None.gif IF CHARINDEX( ' ASC ', @Sort) > 0
51 None.gif SET @strSortColumn = REPLACE( @Sort, ' ASC ', '')
52 None.gif ELSE
53 None.gif SET @strSortColumn = @Sort
54 None.gif
55 None.gif SET @operator = ' > '
56 None.gif END
57 None.gif
58 None.gif
59 None.gif IF CHARINDEX( ' . ', @strSortColumn) > 0
60 None.gif BEGIN
61 None.gif SET @SortTable = SUBSTRING( @strSortColumn, 0, CHARINDEX( ' . ', @strSortColumn))
62 None.gif SET @SortName = SUBSTRING( @strSortColumn, CHARINDEX( ' . ', @strSortColumn) + 1, LEN( @strSortColumn))
63 None.gif END
64 None.gif ELSE
65 None.gif BEGIN
66 None.gif SET @SortTable = @Tables
67 None.gif SET @SortName = @strSortColumn
68 None.gif END
69 None.gif
70 None.gif SELECT @type =t.name, @prec =c.prec
71 None.gif FROM sysobjects o
72 None.gif JOIN syscolumns c on o.id =c.id
73 None.gif JOIN systypes t on c.xusertype =t.xusertype
74 None.gif WHERE o.name = @SortTable AND c.name = @SortName
75 None.gif
76 None.gif IF CHARINDEX( ' char ', @type) > 0
77 None.gif SET @type = @type + ' ( ' + CAST( @prec AS varchar) + ' ) '
78 None.gif
79 None.gif DECLARE @strPageSize varchar( 50)
80 None.gif DECLARE @strStartRow varchar( 50)
81 None.gif DECLARE @strFilter varchar( 1000)
82 None.gif DECLARE @strSimpleFilter varchar( 1000)
83 None.gif DECLARE @strGroup varchar( 1000)
84 None.gif
85 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*Default Page Number*/
86 None.gif IF @PageNumber < 1
87 None.gif SET @PageNumber = 1
88 None.gif
89 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*Set paging variables.*/
90 None.gif SET @strPageSize = CAST( @PageSize AS varchar( 50))
91 None.gif SET @strStartRow = CAST((( @PageNumber - 1) * @PageSize + 1) AS varchar( 50))
92 None.gif
93 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*Set filter & group variables.*/
94 None.gif IF @Filter IS NOT NULL AND @Filter != ''
95 None.gif BEGIN
96 None.gif SET @strFilter = ' WHERE ' + @Filter + ' '
97 None.gif SET @strSimpleFilter = ' AND ' + @Filter + ' '
98 None.gif END
99 None.gif ELSE
100 None.gif BEGIN
101 None.gif SET @strSimpleFilter = ''
102 None.gif SET @strFilter = ''
103 None.gif END
104 None.gif IF @Group IS NOT NULL AND @Group != ''
105 None.gif SET @strGroup = ' GROUP BY ' + @Group + ' '
106 None.gif ELSE
107 None.gif SET @strGroup = ''
108 None.gif
109 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*Get rows count.*/
110 None.gif DECLARE @str_Count_SQL nvarchar( 500)
111 None.gif SET @str_Count_SQL = ' SELECT @TotalCount=count(*) FROM ' + @Tables + @strFilter
112 None.gif EXEC sp_executesql @str_Count_SQL,N ' @TotalCount int=0 output ', @RecordCount output
113 None.gif
114 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*Execute dynamic query*/
115 None.gif IF @Sort = @PK
116 None.gif BEGIN
117 None.gif EXEC(
118 None.gif '
119 None.gif DECLARE @SortColumn ' + @type + '
120 None.gif SET ROWCOUNT ' + @strStartRow + '
121 None.gif SELECT @SortColumn= ' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
122 None.gif SET ROWCOUNT ' + @strPageSize + '
123 None.gif SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' = @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
124 None.gif '
125 None.gif )
126 None.gif END
127 None.gif ELSE
128 None.gif BEGIN
129 None.gif EXEC(
130 None.gif '
131 None.gif DECLARE @SortColumn ' + @type + '
132 None.gif DECLARE @SortNullValue ' + @type + '
133 None.gif DECLARE @PKStartValue int
134 None.gif SET @SortNullValue=CAST( '''' as ' + @type + ' )
135 None.gif SET ROWCOUNT ' + @strStartRow + '
136 None.gif SELECT @SortColumn= isNull( ' + @strSortColumn + ' ,@SortNullValue), @PKStartValue = ' + @PK + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ' , ' + @PK + ' Desc
137 None.gif SET ROWCOUNT ' + @strPageSize + '
138 None.gif 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 None.gif '
140 None.gif )
141 None.gif END
142 None.gif GO
143 None.gif SET QUOTED_IDENTIFIER OFF
144 None.gif GO
145 None.gif SET ANSI_NULLS ON
146 None.gif GO
147 None.gif
148 None.gif
http://www.codeproject.com/aspnet/PagingLarge.asp
None.gif邹建的存储过程
None.gif ALTER PROC PageView
None.gif @tbname sysname, -- 要分页显示的表名
None.gif
@FieldKey sysname, -- 用于定位记录的主键(惟一键)字段,只能是单个字段
None.gif
@PageCurrent int = 1, -- 要显示的页码
None.gif
@PageSize int = 10, -- 每页的大小(记录数)
None.gif
@FieldShow nvarchar( 1000) = '', -- 以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
None.gif
@FieldOrder nvarchar( 1000) = '', -- 以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
None.gif
-- 用于指定排序顺序
None.gif
@Where nvarchar( 1000) = '', -- 查询条件
None.gif
@PageCount int OUTPUT -- 总页数
None.gif
AS
None.gif DECLARE @sql nvarchar( 4000)
None.gif SET NOCOUNT ON
None.gif -- 检查对象是否有效
None.gif
IF OBJECT_ID( @tbname) IS NULL
None.gif BEGIN
None.gif RAISERROR(N ' 对象"%s"不存在 ', 1, 16, @tbname)
None.gif RETURN
None.gif END
None.gif IF OBJECTPROPERTY( OBJECT_ID( @tbname),N ' IsTable ') = 0
None.gif AND OBJECTPROPERTY( OBJECT_ID( @tbname),N ' IsView ') = 0
None.gif AND OBJECTPROPERTY( OBJECT_ID( @tbname),N ' IsTableFunction ') = 0
None.gif BEGIN
None.gif RAISERROR(N ' "%s"不是表、视图或者表值函数 ', 1, 16, @tbname)
None.gif RETURN
None.gif END
None.gif
None.gif -- 分页字段检查
None.gif
IF ISNULL( @FieldKey,N '') = ''
None.gif BEGIN
None.gif RAISERROR(N ' 分页处理需要主键(或者惟一键) ', 1, 16)
None.gif RETURN
None.gif END
None.gif
None.gif -- 其他参数检查及规范
None.gif
IF ISNULL( @PageCurrent, 0) < 1 SET @PageCurrent = 1
None.gif IF ISNULL( @PageSize, 0) < 1 SET @PageSize = 10
None.gif IF ISNULL( @FieldShow,N '') =N '' SET @FieldShow =N ' * '
None.gif IF ISNULL( @FieldOrder,N '') =N ''
None.gif SET @FieldOrder =N ''
None.gif ELSE
None.gif SET @FieldOrder =N ' ORDER BY ' + LTRIM( @FieldOrder)
None.gif IF ISNULL( @Where,N '') =N ''
None.gif SET @Where =N ''
None.gif ELSE
None.gif SET @Where =N ' WHERE ( ' + @Where +N ' ) '
None.gif
None.gif -- 如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
None.gif
IF @PageCount IS NULL
None.gif BEGIN
None.gif SET @sql =N ' SELECT @PageCount=COUNT(*) '
None.gif +N ' FROM ' + @tbname
None.gif +N ' ' + @Where
None.gif EXEC sp_executesql @sql,N ' @PageCount int OUTPUT ', @PageCount OUTPUT
None.gif SET @PageCount =( @PageCount + @PageSize - 1) / @PageSize
None.gif END
None.gif
None.gif -- 计算分页显示的TOPN值
None.gif
DECLARE @TopN varchar( 20), @TopN1 varchar( 20)
None.gif SELECT @TopN = @PageSize,
None.gif @TopN1 = @PageCurrent * @PageSize
None.gif
None.gif -- 第一页直接显示
None.gif
IF @PageCurrent = 1
None.gif EXEC(N ' SELECT TOP ' + @TopN
None.gif +N ' ' + @FieldShow
None.gif +N ' FROM ' + @tbname
None.gif +N ' ' + @Where
None.gif +N ' ' + @FieldOrder)
None.gif ELSE
None.gif BEGIN
None.gif SELECT @PageCurrent = @TopN1,
None.gif @sql =N ' SELECT @n=@n-1,@s=CASE WHEN @n< ' + @TopN
None.gif +N ' THEN @s+N '' , '' +QUOTENAME(RTRIM(CAST( ' + @FieldKey
None.gif +N ' as varchar(8000))),N '''''''' ) ELSE N '''' END FROM ' + @tbname
None.gif +N ' ' + @Where
None.gif +N ' ' + @FieldOrder
None.gif SET ROWCOUNT @PageCurrent
None.gif EXEC sp_executesql @sql,
None.gifN ' @n int,@s nvarchar(4000) OUTPUT ',
None.gif @PageCurrent, @sql OUTPUT
None.gif SET ROWCOUNT 0
None.gif IF @sql =N ''
None.gif EXEC(N ' SELECT TOP 0 '
None.gif +N ' ' + @FieldShow
None.gif +N ' FROM ' + @tbname)
None.gif ELSE
None.gif BEGIN
None.gif SET @sql = STUFF( @sql, 1, 1,N '')
None.gif -- 执行查询
None.gif
EXEC(N ' SELECT TOP ' + @TopN
None.gif +N ' ' + @FieldShow
None.gif +N ' FROM ' + @tbname
None.gif +N ' WHERE ' + @FieldKey
None.gif +N ' IN( ' + @sql
None.gif +N ' ) ' + @FieldOrder)
None.gif END
None.gif END



本文转自高海东博客园博客,原文链接http://www.cnblogs.com/ghd258/archive/2006/01/11/314988.html,如需转载请自行联系原作者
相关文章
|
7月前
|
存储
SQLServer分页获取数据的存储过程
SQLServer分页获取数据的存储过程
25 0
|
7月前
|
存储 开发框架 前端开发
基于MySQL 实现通用分页存储过程(下篇-超详细)(上)
基于MySQL 实现通用分页存储过程(下篇-超详细)
71 0
|
7月前
|
存储 XML 安全
基于MySQL 实现通用分页存储过程(下篇-超详细)(下)
基于MySQL 实现通用分页存储过程(下篇-超详细)
41 0
|
10月前
|
存储
【干货】SqlServer 总结几种存储过程分页的使用
【干货】SqlServer 总结几种存储过程分页的使用
|
存储 SQL Perl
PL/SQL编程—分页功能(存储过程)
PL/SQL编程—分页功能(存储过程)
89 0
|
存储
通用分页存储过程,干货无污染
通用分页存储过程,干货无污染