此文讲述mvc4+entityframework6+sqlserver2008环境下调用存储过程,实现分页。

1、分页存储过程代码如下:

分页原理用的row_number()和over()函数实现(没有用top、not in,因为性能低;sqlserver2012有新特性,用offset、fetch实现)。

这里支持多表查询分页。

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[Procedure_SpiltPage]
(    
    
    @pageIndex INT =1,                     --页索引
    @pageSize INT =10,                     --页大小
    @tableName NVARCHAR(100),              --表名    
    @fieldName NVARCHAR(200) ='*',         --查询字段
    @whereCondition NVARCHAR(800) ='1=1',  --where条件
    @orderCondition NVARCHAR(200),         --order条件
    @recordTotal INT OUTPUT,               --输出记录总数
    @pageCount INT OUTPUT                  --输出分页数
)

AS
BEGIN
    DECLARE @sqlStr NVARCHAR(1000);
    
    SET NOCOUNT ON; --不返回计数
    
    --返回记录总数
    SET @sqlStr = 'SELECT @recordTotal = COUNT(*) FROM '+@tableName+' WHERE '+@whereCondition
    EXEC sp_executesql @sqlStr,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT
    SET @pageCount=(@recordTotal+@pageSize-1)/@pageSize
    
    --查询列表    
    --如果是第一页
    IF (@pageIndex<=1)
        BEGIN
            --N'表示强制转换为Unicode字符,不会乱码
            SET @sqlStr=N'SELECT TOP '+CAST(@pageSize AS VARCHAR)+' '+@fieldName+' FROM '+@tableName+' WHERE '+@whereCondition+' ORDER BY '+@orderCondition
        END
    ELSE
        BEGIN
            --为了适应多表查询,下面把第一处@fieldName改为*,这里不查询全部字段,因为第二个@fieldName
            SET @sqlStr=N'SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@orderCondition+') AS rownum, '
                          +@fieldName+' FROM '+@tableName+' WHERE '+@whereCondition+') AS myTable WHERE rownum BETWEEN '
                          +CAST(((@pageIndex-1)*@pageSize+1) AS NVARCHAR)+' AND '+CAST((@pageIndex*@pageSize) AS NVARCHAR)
        END    
        
    EXEC (@sqlStr)
        
    SET NOCOUNT OFF;
END

GO
存储过程

相关文章:

  • 2021-06-26
  • 2022-12-23
  • 2021-05-21
  • 2021-04-01
  • 2022-01-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-08
  • 2022-02-07
相关资源
相似解决方案