通用的分页存储过程
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
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
相关文章推荐
- 通用存储过程.分页存储过程
- 通用存储过程.分页存储过程
- java+oracle的存储过程开发案例(包含了oracle存储过程的通用分页方法、java的工厂类)
- 通用数据库存储过程代码--高效分页存储过程
- -- 临时表缓存实现的通用分页存储过程
- 通用高效分页存储过程代码
- mysql通用分页存储过程
- 原创:SQL Server的通用分页存储过程,未使用游标,速度更快!
- SQL Server 2000通用分页查询存储过程(可指定返回字段,查询条件)
- 通用高效分页存储过程代码
- Oracle通用分页存储过程和AspNetPage结合
- 存储过程大数据通用高效分页(不带条件和排序)
- 比较通用的存储过程分页
- 真正通用的SQL分页存储过程
- MS SQLSERVER通用存储过程分页
- 字符串缓存实现的通用分页存储过程
- [百万级]通用存储过程.分页存储过程
- [百万级]通用存储过程.分页存储过程
- [MSSQL]SQL通用存储过程分页,支持多表联合
- 通用分页显示查询存储过程(SQL Server)