(SQL Server)分頁的儲存過程

lanchengxiaoxiao發表於2012-05-04

http://www.cnitblog.com/ffan/archive/2005/07/30/1194.html


(SQL Server)分頁的儲存過程

CREATE procedure main_table_pwqzc
(@pagesize 
int,
@pageindex 
int,
@docount 
bit,
@this_id 
int)
as
if(@docount=1)
begin
select count(id) from luntan where this_id=@this_id
end
else
begin
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
create table #pageindex(id int identity(1,1not null,nid int)
set rowcount @PageUpperBound
insert into #pageindex(nid)
select id from luntan where this_id=@this_id order by reply_time desc
select O.*
from luntan O,#pageindex p
where O.id=p.nid and p.id>@PageLowerBound and p.id<=@PageUpperBound order by p.id
end
GO

儲存過程會根據傳入的引數@docount來確定是不是要返回所有要分頁的記錄總數
特別是這兩行
set rowcount @PageUpperBound
insert into @indextable(nid) select id from luntan where this_id=@this_id order by reply_time desc

真的是妙不可言!!set rowcount @PageUpperBound當記錄數達到@PageUpperBound時就會停止處理查詢
,select id 只把id列取出放到臨時表裡,select a.* from luntan a,@indextable t where a.id=t.nid
and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
而這句也只從表中取出所需要的記錄,而不是所有的記錄,結合起來,極大的提高了效率!!

(2)

CREATE PROCEDURE Paging_RowCount
(
@Tables 
varchar(1000),
@PK 
varchar(100),
@Sort 
varchar(200= NULL,
@PageNumber 
int = 1,
@PageSize 
int = 10,
@Fields 
varchar(1000= '*',
@Filter 
varchar(1000= NULL,
@Group 
varchar(1000= NULL)
AS

/*Default Sorting*/
IF @Sort IS NULL OR @Sort = ''
    
SET @Sort = @PK

/*Find the @PK type*/
DECLARE @SortTable varchar(100)
DECLARE @SortName varchar(100)
DECLARE @strSortColumn varchar(200)
DECLARE @operator char(2)
DECLARE @type varchar(100)
DECLARE @prec int

/*Set sorting variables.*/    
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, 0CHARINDEX('.',@strSortColumn))
        
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@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)

/*Default Page Number*/
IF @PageNumber < 1
    
SET @PageNumber = 1

/*Set paging variables.*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1AS varchar(50))

/*Set filter & group variables.*/
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 = ''
    
/*Execute dynamic query*/    
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

相關文章