基础于SET ROWCOUNT 的分页存储过程
2008-02-02 11:20
363 查看
Set RowCount 功能:
使 Microsoft® SQL Server™ 在返回指定的行数之后停止处理查询。
如
Declare @SortID --A表的整形主键1,2,3.....1000
Set RowCount 10
Select @SortID=SortID From [A] Order By SortID DESC
Print @SortID
结果为991
Set RowCount 10
Select * From [A] Order By SortID DESC
结果为一个记录集,SortID 为 1000-991
我们按pagesize为10,将A表按SortID 递减排列,取第2页的代码如下
Declare @SortID
Set RowCount 10 --- pageSize * (2-1)
Select @SortID=SortID From [A] Order By SortID DESC
Set Rowcount PageSize
Select * From [A] Where SortID < @SortID Order By SortID DESC
下面的是动易的用来按不同字段排序并分页的一个通用存储过程(SQL2000)
ALTER PROCEDURE [dbo].[PR_Common_GetListBySortColumn]
(
@StartRows int,
@PageSize int,
@PrimaryColumn varchar(1000),--主键
@SortColumnDbType varchar(100), --排序字段的数值类型 如 Int ,DateTime等
@SortColumn varchar(1000),---排序的列
@StrColumn varchar(1000),--- 需要选择的列
@Sorts varchar(100),--- ASC|DESC|空字串(ASC)
@Filter varchar(1000),--- where 后面的条件
@TableName varchar(1000),-- 表名
@Total int OUTPUT
)
AS
SET NOCOUNT ON
Begin
IF @StartRows<=0
SET @StartRows = 0
DECLARE @equalOperator char(2)
IF @StartRows=0
BEGIN
SET @equalOperator = '='
SET @StartRows = 1
END
ELSE
SET @equalOperator = ''
/*Set sorting variables.*/
DECLARE @operator char(2)
IF CHARINDEX('DESC',@Sorts)>0
BEGIN
SET @operator = '<' + @equalOperator
END
ELSE
BEGIN
SET @operator = '>' + @equalOperator
END
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
IF @Filter IS NOT NULL AND @Filter!=''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strFilter = ''
SET @strSimpleFilter = ''
END
DECLARE @Sql nVarchar(4000)
SET @Sql=N'SELECT @Total=Count(*) FROM ' + @TableName + @strFilter
Exec sp_executesql @Sql, N'@Total Int Out',@Total Out
IF @PageSize<=0
SET @PageSize=@Total
IF @PrimaryColumn!=@SortColumn
BEGIN
EXEC(
'DECLARE @SortId int ' +
'DECLARE @SortCol '+ @SortColumnDbType + ' '+
'SET ROWCOUNT '+ @StartRows + '
SELECT @SortId = '+ @PrimaryColumn + ',@SortCol='+ @SortColumn +' FROM '+ @TableName + @strFilter +' ORDER BY '+ @SortColumn +' ' +@Sorts + ',' + @PrimaryColumn + ' ' +@Sorts +'
SET ROWCOUNT '+ @PageSize + '
SELECT '+ @StrColumn +' FROM '+ @TableName + '
WHERE ('+ @SortColumn + @operator+' @SortCol OR ('+ @SortColumn + '= @SortCol AND '+ @PrimaryColumn + @operator +' @SortId ))' + @strSimpleFilter + ' ORDER BY '+ @SortColumn + ' ' +@Sorts + ',' + @PrimaryColumn + ' '+ @Sorts + ''
)
END
ELSE
BEGIN
EXEC(
'DECLARE @SortId int ' +
'SET ROWCOUNT '+ @StartRows + '
SELECT @SortId = '+ @SortColumn + ' FROM '+ @TableName + @strFilter +' ORDER BY '+ @SortColumn + ' ' +@Sorts +'
SET ROWCOUNT '+ @PageSize + '
SELECT '+ @StrColumn +' FROM '+ @TableName + '
WHERE '+ @SortColumn + @operator +' @SortId '+ @strSimpleFilter + ' ORDER BY '+ @SortColumn +' '+ @Sorts + ''
)
END
Return @Total
END
SET ROWCOUNT 0
SET NOCOUNT OFF
说明 后面那2节动态SQL 根据SortColumn 是不是等于 PrimaryColumn (主键)进行分别处理,
1.当2个相等时,只要在条件处(where )@SortColumn + @operator +' @SortId ' 即可
2.当主键不等于SortColumn时,就有可能存在 SortColumn列存在多个同值的情况,故可以看到排列语句(Order By)使用的是 ' ORDER BY '+ @SortColumn + ' ' +@Sorts + ',' + @PrimaryColumn + ' '+ @Sorts + '',即主键做为第2排序对象,比方有张表B(SortID,RefTime,Name) 其中SortID为int类型主键,RefTime为刷新时间,那么我们需要按刷新时间到序来分页取数据, 当RefTime没有重复时,where 条件后为@SortColumn + @operator+ @SortCol 即可,但是当RefTime有重复时,我们需要加上 OR ('+ @SortColumn + '= @SortCol AND '+ @PrimaryColumn + @operator +' @SortId ) ,因为按,RefTime DESC,SortID DESC 排列后,如果当前分页存在RefTime相同的记录,那么他们必定符合
@RefTime(分页第一条)>=RefTime And @SortID > SortID 将 >=分开写就是上面存储过程里的代码形式
使用这个分页存储过程,需要目标表(记录集)有一个值唯一的单一列(不允许组合列),这个列通常是主键.
使 Microsoft® SQL Server™ 在返回指定的行数之后停止处理查询。
如
Declare @SortID --A表的整形主键1,2,3.....1000
Set RowCount 10
Select @SortID=SortID From [A] Order By SortID DESC
Print @SortID
结果为991
Set RowCount 10
Select * From [A] Order By SortID DESC
结果为一个记录集,SortID 为 1000-991
我们按pagesize为10,将A表按SortID 递减排列,取第2页的代码如下
Declare @SortID
Set RowCount 10 --- pageSize * (2-1)
Select @SortID=SortID From [A] Order By SortID DESC
Set Rowcount PageSize
Select * From [A] Where SortID < @SortID Order By SortID DESC
下面的是动易的用来按不同字段排序并分页的一个通用存储过程(SQL2000)
ALTER PROCEDURE [dbo].[PR_Common_GetListBySortColumn]
(
@StartRows int,
@PageSize int,
@PrimaryColumn varchar(1000),--主键
@SortColumnDbType varchar(100), --排序字段的数值类型 如 Int ,DateTime等
@SortColumn varchar(1000),---排序的列
@StrColumn varchar(1000),--- 需要选择的列
@Sorts varchar(100),--- ASC|DESC|空字串(ASC)
@Filter varchar(1000),--- where 后面的条件
@TableName varchar(1000),-- 表名
@Total int OUTPUT
)
AS
SET NOCOUNT ON
Begin
IF @StartRows<=0
SET @StartRows = 0
DECLARE @equalOperator char(2)
IF @StartRows=0
BEGIN
SET @equalOperator = '='
SET @StartRows = 1
END
ELSE
SET @equalOperator = ''
/*Set sorting variables.*/
DECLARE @operator char(2)
IF CHARINDEX('DESC',@Sorts)>0
BEGIN
SET @operator = '<' + @equalOperator
END
ELSE
BEGIN
SET @operator = '>' + @equalOperator
END
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
IF @Filter IS NOT NULL AND @Filter!=''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strFilter = ''
SET @strSimpleFilter = ''
END
DECLARE @Sql nVarchar(4000)
SET @Sql=N'SELECT @Total=Count(*) FROM ' + @TableName + @strFilter
Exec sp_executesql @Sql, N'@Total Int Out',@Total Out
IF @PageSize<=0
SET @PageSize=@Total
IF @PrimaryColumn!=@SortColumn
BEGIN
EXEC(
'DECLARE @SortId int ' +
'DECLARE @SortCol '+ @SortColumnDbType + ' '+
'SET ROWCOUNT '+ @StartRows + '
SELECT @SortId = '+ @PrimaryColumn + ',@SortCol='+ @SortColumn +' FROM '+ @TableName + @strFilter +' ORDER BY '+ @SortColumn +' ' +@Sorts + ',' + @PrimaryColumn + ' ' +@Sorts +'
SET ROWCOUNT '+ @PageSize + '
SELECT '+ @StrColumn +' FROM '+ @TableName + '
WHERE ('+ @SortColumn + @operator+' @SortCol OR ('+ @SortColumn + '= @SortCol AND '+ @PrimaryColumn + @operator +' @SortId ))' + @strSimpleFilter + ' ORDER BY '+ @SortColumn + ' ' +@Sorts + ',' + @PrimaryColumn + ' '+ @Sorts + ''
)
END
ELSE
BEGIN
EXEC(
'DECLARE @SortId int ' +
'SET ROWCOUNT '+ @StartRows + '
SELECT @SortId = '+ @SortColumn + ' FROM '+ @TableName + @strFilter +' ORDER BY '+ @SortColumn + ' ' +@Sorts +'
SET ROWCOUNT '+ @PageSize + '
SELECT '+ @StrColumn +' FROM '+ @TableName + '
WHERE '+ @SortColumn + @operator +' @SortId '+ @strSimpleFilter + ' ORDER BY '+ @SortColumn +' '+ @Sorts + ''
)
END
Return @Total
END
SET ROWCOUNT 0
SET NOCOUNT OFF
说明 后面那2节动态SQL 根据SortColumn 是不是等于 PrimaryColumn (主键)进行分别处理,
1.当2个相等时,只要在条件处(where )@SortColumn + @operator +' @SortId ' 即可
2.当主键不等于SortColumn时,就有可能存在 SortColumn列存在多个同值的情况,故可以看到排列语句(Order By)使用的是 ' ORDER BY '+ @SortColumn + ' ' +@Sorts + ',' + @PrimaryColumn + ' '+ @Sorts + '',即主键做为第2排序对象,比方有张表B(SortID,RefTime,Name) 其中SortID为int类型主键,RefTime为刷新时间,那么我们需要按刷新时间到序来分页取数据, 当RefTime没有重复时,where 条件后为@SortColumn + @operator+ @SortCol 即可,但是当RefTime有重复时,我们需要加上 OR ('+ @SortColumn + '= @SortCol AND '+ @PrimaryColumn + @operator +' @SortId ) ,因为按,RefTime DESC,SortID DESC 排列后,如果当前分页存在RefTime相同的记录,那么他们必定符合
@RefTime(分页第一条)>=RefTime And @SortID > SortID 将 >=分开写就是上面存储过程里的代码形式
使用这个分页存储过程,需要目标表(记录集)有一个值唯一的单一列(不允许组合列),这个列通常是主键.
相关文章推荐
- 分页存储过程,综合了NOT_IN和SET ROWCOUNT
- 分页存储过程,综合了NOT_IN和SET ROWCOUNT
- 分页存储过程,综合了NOT_IN和SET ROWCOUNT
- sqlserver存储过程中,set rowcount 0是什么意思?
- sqlserver2005利用临时表和@@RowCount提高分页查询存储过程性能示例分享
- SQL Server 2005中利用临时表和@@RowCount提高分页查询存储过程性能
- 从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程
- 存储过程中的 SET NOCOUNT ON 和SET NOCOUNT OFF是 什么意思?
- 存储过程 SET NOCOUNT ON
- Oracle带输入、输出参数的存储过程 返回受影响的行数 SQL%ROWCOUNT
- 存储过程中的 SET NOCOUNT ON 什么意思?
- 使用vs2005的rowNumber对数据实现分页的存储过程。
- 存储过程中的 SET NOCOUNT ON
- 关于Set Nocount ON的性能 |c#调用存储过程的返回值总是-1
- [转]一个利用Sql Server 20005的 ROW_NUMBER Function 的分页存储过程.
- SQL 2005-2008 存储过程分页程序 ROW_NUMBER()
- sqlserver 通用存储过程分页代码(附使用ROW_NUMBER()和不使用ROW_NUMBER()两种情况性能分析)
- SQL Server中利用SET ROWCOUNT来高性能地进行分页
- SQL Server中利用SET ROWCOUNT来高性能地进行分页
- 错误 '800a0e78' 存储过程中缺少 set nocount on 导致错误