您的位置:首页 > 数据库

mssql 存储过程学习中 [5] 记录集分页

2010-08-08 23:22 483 查看
直接拷贝shiwenbin大的过来用,没仔细研究呢.呵呵.大体用的row_number().

相当好用,支持多表联合多条件查询

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

--Declare @sql nvarchar(4000);
--Declare @totalRecord int;
----计算总记录数
--if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
--set @sql = 'select @totalRecord = count(*) from ' + @TableName
--else
--set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
--EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT-- 计算总记录数
--
----计算总页数
--
--select @TotalPage=@totalRecord --CEILING((@totalRecord+0.0)/@PageSize)
-- =============================================
-- Author:    shiwenbin
-- MSN:    jorden008@hotmail.com
-- Email:    jorden008@163.com
-- Create date: 2009-10-20
-- Description:   分页存储过程,根据传递的参数返回分页的结果
-- Parameters:
-- =============================================
--CREATE PROCEDURE Pagination
ALTER PROCEDURE Pagination
-- Add the parameters for the stored procedure here

@StrSelect varchar(2000)=null,    --欲显示的列(多列用逗号分开),例如:id,name
@StrFrom varchar(2000)= null,    --表名称,或者是表连接字符串,多表连接例如:student as s inner join dwinfo as dw on s.dwbh=dw.bh
@StrWhere varchar(2000)=null,    --查询条件,''代表没有条件,单条件或者多条件,多条件例如:name='啊 ' and id=10
@StrOrder varchar(2000) =null,   --排序列(多个排序列用逗号分开),例如:id desc,name as
--@PageCount int output,     -- 总页数
@ItemCount bigint output,     --总记录数
@PageSize int =50,     --每页显示条数
@BeginIndex int=1,--记录开始数
@DoCount bit =0 --是否统计总数,为0不统计,为1统计
--@PageIndex int =1     --当前页
--@ClassCode char(10) =null,    --单位编号(班级编号)
AS
BEGIN
SET NOCOUNT ON;

Declare @sql nvarchar(4000);
Declare @totalRecord int;
--计算总记录数
if @DoCount = 1
begin
if (@StrWhere ='''' or @StrWhere='' or @StrWhere is NULL)
set @sql = 'select @totalRecord = count(*) from ' + @StrFrom
else
set @sql = 'select @totalRecord = count(*) from ' + @StrFrom + ' where ' + @StrWhere
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@ItemCount OUTPUT--计算总记录数
end
declare @SqlQuery varchar(max)
-- if(@PageIndex=1)
if(@BeginIndex=1 or @BeginIndex=0  or @BeginIndex <0)
begin
if(@StrWhere is null)--if(@StrWhere='')
set @SqlQuery='select top '+convert(varchar,@PageSize)
+ ' row_number() over(order by '+@StrOrder+' ) as RowNumber,'+@StrSelect+
' from '+@StrFrom;
else
--set @sql='select top @PageSize * from @TableName order by id desc';
--select top @PageSize * from @TableName order by id desc;
set @SqlQuery='select top '+convert(varchar,@PageSize)
+ ' row_number() over(order by '+@StrOrder+' ) as RowNumber,'+@StrSelect+' from '+@StrFrom+' where '+@StrWhere;
--exec (@SqlQuery)
--      @SqlQuery
end
else
begin
if(@StrWhere is null)--if(@StrWhere='')
begin
set @SqlQuery='with cte as (
select row_number() over(order by '+@StrOrder+' ) as RowNumber,'+@StrSelect+' from '+@StrFrom+'
)
select * from cte where RowNumber between '+
--convert(varchar,((@PageIndex-1)*@PageSize)+1)+' and '+
--
--      convert(varchar,@PageIndex*@PageSize)
convert(varchar,@BeginIndex)+' and '+
convert(varchar,@BeginIndex+@PageSize-1)
--print @SqlQuery
end
else
begin

set @SqlQuery='with cte as (
select row_number() over(order by '+@StrOrder+' ) as RowNumber,'+@StrSelect+' from '+@StrFrom+' where '+@StrWhere+'
)
select * from cte where RowNumber between '+
--convert(varchar,((@PageIndex-1)*@PageSize)+1)+' and '+
--
--        convert(varchar,@PageIndex*@PageSize)
convert(varchar,@BeginIndex)+' and '+
convert(varchar,@BeginIndex+@PageSize-1)
--print @SqlQuery
end
end
--set @SqlQuery=@SqlQuery+';select @ItemCount =count(*) from '+@TableName
--set @PageCount=@ItemCount/@PageSize
--print '共'+@PageConut+'页'+@ItemCount+'条 '
--print @ItemCount
print @SqlQuery
print @ItemCount
exec (@SqlQuery)
return @ItemCount
END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: