USE [GoodsSystem]
GO
/****** 对象: StoredProcedure [dbo].[proc_table_paging] 脚本日期: 08/30/2010 16:03:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
使用 ROW_NUMBER() OVER 分页的例子
WITH tb_temp AS
(SELECT *,ROW_NUMBER() OVER (ORDER BY productid asc) as RowNumber from goods )
SELECT * FROM tb_temp WHERE RowNumber between 50 and 60;
*/
--exec [dbo].[proc_table_paging] 'goods','gid','','price',10,10000,9,'',1
--drop proc [dbo].[proc_table_paging]
-----------------------------------------------
-- 使用 ROW_NUMBER() OVER 分页的存储过程
-----------------------------------------------
CREATE PROCEDURE [dbo].[proc_table_paging]
@tblName varchar(255), -- 表名
@keyFields varchar(255), -- 主键列名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255) = @keyFields, -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType bit = 0, -- 设置排序类型, 非0值则降序
@strWhere varchar(1500) = '', -- 查询条件(注意: 不要加where)
@doCount bit = 0 -- 统计并返回记录总数, 非0值则返回
AS
declare @strSQL varchar(5000) -- 主语句
declare @strOrder varchar(400) -- 排序类型
declare @begin varchar(20) -- 起始行数
declare @end varchar(20) -- 结束行数
-- 默认返回所有列
if rtrim(ltrim(@strGetFields))=''
set @strGetFields='*'
-- 默认排序字段为主键列
if rtrim(ltrim(@fldName))=''
set @fldName=@keyFields
-- 默认每页大小为10行记录
if @PageSize<1
set @PageSize=10
-- 默认查询第一页
if @PageIndex<1
set @PageIndex=1
-- 默认没有where子句
if rtrim(ltrim(@strWhere))=''
set @strWhere=''
-- 默认为0时升序排列,否则降序排列
if @OrderType=0
set @strOrder = 'asc'
else
set @strOrder = 'desc'
-- 默认为0时不进行记录数的统计,否则统计并返回共有几条记录符合查询条件
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
else
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
exec (@strSQL)
end
-- 计算起始行数和终止行数
set @begin = cast( @PageSize*(@PageIndex-1)+1 as varchar(20) )
set @end = cast( @PageSize*@PageIndex as varchar(20) )
-- 构造临时表
if @strWhere!=''
begin
set @strSQL = 'WITH tb_temp AS (SELECT '+@strGetFields+' ,ROW_NUMBER() OVER (ORDER BY '+@fldName+' '+@strOrder+' )as RowNumber from '+@tblName+' where '+@strWhere+') '
end
else
begin
set @strSQL = 'WITH tb_temp AS (SELECT '+@strGetFields+' ,ROW_NUMBER() OVER (ORDER BY '+@fldName+' '+@strOrder+' )as RowNumber from '+@tblName+') '
end
-- 从临时表中查询出结果
set @strSQL = @strSQL + ' SELECT '+@strGetFields+' FROM tb_temp WHERE RowNumber between '+@begin+' and '+@end
print @strSQL
exec (@strSQL)
分享到:
相关推荐
利用SQL 2005中的Row_number() 进行数据分页
分页存储过程,仅适用于Sql2005以上,使用 ROW_NUMBER()函数用于多表分页查询,可以分组查询
简单又实用的 存储过程分页 真正的实现分页技术 可不是一锅端的分页 用存储过程实现的 好用到 2005 新特性ROW_NUMBER() 这个函数
分页存储过程整理: 1.拼字符串 2.SQL2005 TOP (表达式) 新功能 3.通过SQL2005 ROW_NUMBER 使用,易用。
通用存储过程分页(使用ROW_NUMBER()和不使用ROW_NUMBER()两种情况)性能分析
本人整理的sql server2008分页存储过程,很好用的,效率很高
sql存储过程分页和利用sql2005的Row_Number分页
SQL Server 2005中ROW_NUMBER()函数在存储过程分页中的应用.pdf
此存储过程只适用于SQL Server2005,因为用到了SQL Server2005中的row_number()函数。 写了一个winform的程序来运行此存储过程,有兴趣的朋友可以看一下,并提供您的宝贵意见。 个人认为这个存储过程是比较容易理解...
sql server2005以上就有了row_number 也是一大进步,详情如下参考 代码如下:Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList](@TableName nvarchar(100), –表名@ColumnNames ...
SQLServer分页存储过程通常有多个版本,但是效率上有高有低,经过测试排名为: 版本1:select max 版本2:row_number 版本3:not in 版本4:临时表 版本5:中间变量 如果主键为int,请使用版本1 如果主键为guid,...
SELECT ROW_NUMBER() OVER(ORDER BY ' + @orderBy + ') AS row, * FROM ' + @datasrc + ' WHERE ' + @filter + ' ) AS tbl WHERE row > ' + CONVERT(varchar(9), @lbound) + ' AND row (varchar(9), @ubound)...
使用sql server 2005的ROW_NUMBER()
ROW_NUMBER() OVER函数 数据库存储过程分页 自动添加字段加编号
--创建分页存储过程 CREATE PROCEDURE [dbo].[pro_GetPagedData] @pageIndex INT,--输入参数,页号 @pageSize INT,--输入参数,每页容量 @rowCount INT OUTPUT,--输出参数,总行数 @pageCount INT OUTPUT--输出参数...
在我的使用SQL Server2005的新函数构造分页存储过程中,我提到了使用ROW_NUMBER()函数来代替top实现分页存储过程。 但是时间长了,又发现了新问题,就是主子表的分页查询。例如:订单表和订单明细表,要求是查询订单...
'select row_number() over (order by ' + @strSort + ') as RowNum ,' + @fldName + ' from ' + @tblName + ') a where a.RowNum > ' + cast((@page -1) * @pageSize as varchar(128)) + ' and a.RowNum (@...
建立好如下的存储过程,以后要分页,直接调用改存储过程就可以了。 注意:数据量大、性能要求高的,请个性化处理。 代码如下: ALTER PROCEDURE [dbo].[COMMON_PROCEDURE_SelectWithPage] @Sql VARCHAR(5000), @...