不断积累,必然飞跃,突破随之!

相信自己,开拓生活!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

较好的分页存储过程

Posted on 2010-03-11 16:29  Tangyuan2017  阅读(184)  评论(0编辑  收藏  举报
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


--drop procedure p_page 
--go 

ALTER procedure [dbo].[CutPage_PRO] 

( 
@Tables varchar(1000), --表名如testtable (如果是联合查询不要用as ,只用表名果如 table1 left join table2)
@PrimaryKey varchar(100),--表的主键,必须唯一性 (联合查询时名表加字段名如:table1.id)
@Sort varchar(200) = NULL,--排序字段如f_Name asc或f_name desc(注意只能有一个排序字段)(联合查询时表名加字段: table1.id) 
@CurrentPage int = 1,--当前页 
@PageSize int = 10,---每页大小 
@Fields varchar(1000) = '*',--显示的字段列表 (联合查询时表名.字段名如:table1.name,table1.age,table2.lvl,table2.gender)
@Filter varchar(1000) = NULL,--条件语句,不加where,如 f_id>3 
@Group varchar(1000) = NULL,--分组字段 
@TotalPage int output --返回总页数 
) 

--WITH ENCRYPTION ---加密存储 

AS 



SET NOCOUNT ON 
Declare @intResult Int 

Begin Tran 

DECLARE @sql nvarchar(4000) 

if @Filter is null or @Filter='' 
set @Sql = 'select @intResult = count(' + @PrimaryKey + ') from ' + @Tables 
else 
set @Sql = 'select @intResult = count(' + @PrimaryKey + ') from ' + @Tables + ' where + ' + @Filter 

EXEC sp_executesql @sql,N'@intResult int OUTPUT',@intResult OUTPUT--计算总记录数 
select @TotalPage=CEILING((@intResult+0.0)/@PageSize)--计算总页数 


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 
IF CHARINDEX('ASC', @Sort) > 0 
BEGIN 
SET @strSortColumn = REPLACE(@Sort, 'ASC', '') 
SET @operator = '>=' 
END 

ELSE 
BEGIN 
SET @strSortColumn = @SORT 
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 = '' 

set @sql = '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 + ' '

--print @sql 

exec(@sql) 


If @@Error <> 0 
Begin 
RollBack Tran 
Return -1 
End 
Else 
Begin 
Commit Tran 
Return @intResult ---返回记录总数 
End 

---------------------------eg-------------
/*
Declare @@intResult Int 
exec CutPage_PRO 
' TreavlPlan left join Book on Book.id=TreavlPlan.planid ',
'TreavlPlan.id',
'TreavlPlan.id desc',
2,
2,
'*',
'TreavlPlan.userid=1',
'',
@@intResult
*/