您的位置:首页 > 其它

分页

2016-03-10 18:33 447 查看
USE [DTMIS_LZ]
GO
/****** Object:  StoredProcedure [dbo].[spPaginationPK]    Script Date: 03/10/2016 18:33:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER  PROCEDURE [dbo].[spPaginationPK]
@TableName varchar(2000),        --表名或视图名
@Fields varchar(5000)='*',        --要返回的列
@OrderField varchar(5000),        --排序字段
@PK varchar(255),                --主键
@SqlWhere varchar(max) = '',    --查询条件(不要加WHERE)
@PageSize int,                    --页尺寸
@PageIndex int=1,                --页码
@TotalPage int OUTPUT,            --总页数
@TotalRecord int OUTPUT            --记录总数
AS
DECLARE @strSql nvarchar(max)
DECLARE @strOrder nvarchar(max)

IF @SqlWhere IS NULL
BEGIN
SET @SqlWhere = ''
END
IF len(@SqlWhere) > 0
BEGIN
SET @strSql = N'SELECT  @TotalRecord =  COUNT(*)  FROM ' + @TableName + N' WHERE ' + @SqlWhere
END
ELSE
BEGIN
SET @strSql =N'SELECT  @TotalRecord =  COUNT(*)  FROM ' + @TableName
END

EXEC sp_executesql @strSql,N'@TotalRecord int OUTPUT',@TotalRecord OUTPUT
SET @TotalPage = ceiling(@TotalRecord * 1.0 / @PageSize)

DECLARE @sql varchar(max)

--实际总共的页码小于当前页码   或者   最大页码
IF  @TotalPage >= 1
--如果分页后页数大于0
BEGIN
IF @TotalPage <= @PageIndex and @TotalPage >=1
--如果实际总共的页数小于datagrid索引的页数
--or   @TotalPage=1
BEGIN
--设置为最后一页
SET @PageIndex=@TotalPage
END
IF @TotalPage <= @PageIndex and @TotalPage=0
BEGIN
SET @PageIndex=1;
END
END

DECLARE @ReSerial int
SET @ReSerial=(@PageIndex-1)*@PageSize

IF @PageIndex = 1 or @TotalPage <= 1     --如果为第一页
BEGIN
IF len(@SqlWhere)   =0
BEGIN
SET   @sql = N'SELECT TOP ' + str(@PageSize) + N' ' + @Fields + N',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+N' as rowId FROM ' + @TableName + N' ORDER BY ' + @OrderField + N' '
END
ELSE
BEGIN
SET   @sql = N'SELECT TOP ' + str( @PageSize) + N' ' + @Fields + N',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+N' as rowId FROM ' + @TableName + N' WHERE ' + @SqlWhere + N' ORDER BY ' + @OrderField + N' '
END
END
ELSE IF @PageIndex = @TotalPage   --如果为最后一页
BEGIN
IF len(@SqlWhere) = 0
BEGIN
SET @sql = N'SELECT ' + @Fields + N',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+N' as rowId FROM ' + @TableName + N' WHERE ' + @PK + N' not in(SELECT top ' + str(@PageSize * (@PageIndex - 1))  + N' ' + @PK+ N' FROM ' + @TableName + N' ORDER BY ' + @OrderField + N' ' + N') ORDER BY '+ @OrderField + N' '
END
ELSE
BEGIN
SET  @sql = ' SELECT ' + @Fields + ',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+' as rowId FROM ' + @TableName + ' WHERE ' + @PK + ' not in (SELECT top ' + str(@PageSize *  (@PageIndex - 1)) + ' ' + @PK + ' FROM ' + @TableName + ' WHERE ' + @SqlWhere + ' ORDER BY ' + ' ' + @OrderField + ' ' + ') AND ' + @SqlWhere + ' ORDER BY ' + @OrderField + ' '
END
END
ELSE   --否则执行
BEGIN
IF len(@SqlWhere) = 0
BEGIN
SET  @sql = N'SELECT TOP ' + str(@PageSize)  + N' ' + @Fields + N',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+N' as rowId  FROM ' + @TableName + N'  WHERE '+ @PK + N' not in(SELECT top ' + str(@PageSize *  (@PageIndex - 1)) + N' ' + @PK + N' FROM ' + @TableName + N' ORDER BY ' + @OrderField + N' ' + N') ORDER BY ' + @OrderField + N' '
END
ELSE
BEGIN
SET @sql = 'SELECT TOP ' + str(@PageSize)  + ' ' + @Fields+ ',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+' as rowId FROM ' + @TableName + ' WHERE ' + @PK + ' not in(SELECT top ' + str(@PageSize *  (@PageIndex - 1)) + ' ' + @PK + ' FROM ' + @TableName + ' WHERE ' + @SqlWhere + ' ORDER BY ' + @OrderField + ' ' + ' ) and ' + @SqlWhere + ' ORDER BY ' + @OrderField + ' '
END
END
EXEC(@sql)


USE [DTMIS_LZ]
GO
/****** Object:  StoredProcedure [dbo].[spPagination]    Script Date: 03/10/2016 18:32:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER Procedure [dbo].[spPagination]
@TableName varchar(2000),        --表名
@Fields varchar(5000) = '*',    --字段名(全部字段为*)
@OrderField varchar(5000),        --排序字段(必须!支持多字段)
@PK varchar(255),                --主键(不使用)
@SqlWhere varchar(5000) = '',--条件语句(不用加where)
@PageSize int,                    --每页多少条记录
@PageIndex int = 1 ,            --指定当前为第几页
@TotalPage int output,            --返回总页数
@TotalRecord int output
as
begin

Declare @sql nvarchar(max);

--计算总记录数
if (@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=CEILING((@TotalRecord+0.0)/@PageSize)

if (@SqlWhere='' or @SqlWhere is NULL)
set @sql = 'select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' into #t from ' + @TableName
else
set @sql = 'select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' into #t from ' + @TableName + ' where ' + @SqlWhere

--处理页数超出范围情况
if @PageIndex<=0
Set @PageIndex = 1

if @PageIndex>@TotalPage
Set @PageIndex = @TotalPage

--处理开始点和结束点
Declare @StartRecord int
Declare @EndRecord int

set @StartRecord = (@PageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @PageSize - 1

--继续合成sql语句
--set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)

--得到临时表
set @sql=@sql+'; select * from  #t  ' + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
set @sql=@sql+';drop table #t'
Exec(@Sql)

Return @TotalRecord ---返回记录总数

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