此文讲述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