您的位置:首页 > 其它

通用的分页存储过程

2008-10-17 13:41 190 查看
这个只要按照给定参数就可以实现分页效果,不过一次返回笔数是有调用者确定

SET QUOTED_IDENTIFIER ON

2GO

3SET ANSI_NULLS ON

4GO

5

6

7ALTER PROCEDURE GetRecords

8(@TableName varchar(15), ---表名

9@KeyName varchar(30), ---key值欄位名

@ReturnFieldName varchar(300), ---返回欄位名集合

@Condition Varchar(1000), ---條件集合

@Order varchar(1000), ---排序集合

@RecordNum int, ---返回一頁的記錄數

@StartNO int, ---開始記錄數

@@RealNum INT OUTPUT, ---真實一頁返回筆數

@@TotalCount INT OUTPUT ) ---總共筆數

AS

DECLARE @PreRecCount VARCHAR( 10 ) ---上次的筆數

DECLARE @CurRecCount VARCHAR( 10 ) ---當前的筆數

declare @ReturnTotal int ---回傳的總筆數

DECLARE @SQLStr NVARCHAR(500) ---回傳總筆數的SQL語句

set @SQLStr=N'SELECT @ReturnTotal=COUNT(*) FROM ' ---因為這個參數要求回傳所以處理不一樣,前者把變量寫在SQL語句中

set @SQLStr=@SQLStr+ @TableName +' WHERE 1=1 ' +@Condition ---直接讓變量轉化為值

exec sp_executesql @SQLStr,N'@ReturnTotal int output',

@ReturnTotal output

Set @@TotalCount=@ReturnTotal

----返回該頁可以返回的真實筆數

IF @@TotalCount > ( @StartNO + 1 ) * @RecordNum

SET @@RealNum = @RecordNum

ELSE

SET @@RealNum = @@TotalCount - @StartNO * @RecordNum

SET @CurRecCount = CAST( @StartNO * @RecordNum + @@RealNum AS VARCHAR( 10 ) )

IF @STARTNO = 0

EXEC( 'SELECT TOP ' + @RecordNum + @ReturnFieldName+' FROM '+@TableName+' WHERE 1=1 '+@Condition+' Order By '+@Order )

ELSE

BEGIN

SET @PreRecCount = CAST( @StartNO * @RecordNum AS VARCHAR( 10 ) )

EXEC( 'SELECT TOP ' + @RecordNum +' '+ @ReturnFieldName+ ' FROM '+@TableName+' WHERE 1=1 '+@Condition+' AND '+@KeyName+' NOT IN '

+ '(SELECT TOP ' + @PreRecCount + @KeyName+' FROM '+@TableName+' WHERE 1=1 '+@Condition+' Order By '+@Order+')' +' Order By '+@Order)

END

print @PreRecCount

print @CurRecCount

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: