分页存储过程

时间:2022-05-26 14:08:38
分页存储过程 **//*
分页存储过程说明: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(@SortColumn1@pos1-1)
分页存储过程        
SET @pos2 = CHARINDEX('.'@SortColumn)
分页存储过程        
IF @pos2 > 0
分页存储过程        
BEGIN
分页存储过程            
SET @SortTable = SUBSTRING(@SortColumn1@pos2-1)
分页存储过程            
IF @pos1 > 0 
分页存储过程                
SET @SortName = SUBSTRING(@SortColumn@pos2+1@pos1-@pos2-1)
分页存储过程            
ELSE
分页存储过程                
SET @SortName = SUBSTRING(@SortColumn@pos2+1LEN(@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'200'''''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'200'''''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(@strSortColumn0CHARINDEX('.',@strSortColumn))
分页存储过程  
SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@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 + 1AS 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(@strSortColumn0CHARINDEX('.',@strSortColumn))
分页存储过程
SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@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 + 1AS 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字段)


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(@tbnameIS 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

  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(@strSortColumn0CHARINDEX('.',@strSortColumn))
 62分页存储过程        SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@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 + 1AS 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分页存储过程