1. Stored procedure
CREATE PROCEDURE [dbo].[p_PageList] @Tables varchar(1000), --table name, please use tA a inner join tB b On a.AID = b.AID for multiple tables @Sort varchar(200) = '', -- sort field and sort direction, when empty, the default is to sort in reverse order by primary key @PageNumber int = 1, -- start page number @PageSize int = 10, -- page size @Fields varchar(1000) = '*', -- read fields @Filter varchar(2000) = NULL, --Where condition length is not enough, from 1000 to 2000 @Group varchar(1000) = NULL, -- grouping @isCount bit = 0, -- whether to get the total number of records @TotalCounts int = 0 output -- the total number of records queried (wuxl added on 2010.01.14) AS DECLARE @strFilter varchar(2000) -- not enough length, changed from 2000 to 2000 declare @sql varchar(max) -- not enough length, from 2000 to max Declare @strTmp nvarchar(max) -- store the query statement that obtains the total number of query results -- filter data SET @strFilter = ' 1 = 1 ' IF @Filter IS NOT NULL AND @Filter != '' BEGIN SET @strFilter += @Filter END -- get the total number of records if @isCount = 1 begin set @strTmp = 'SELECT @TotalCounts= Count(1) FROM '+ @Tables + ' where ' + @strFilter exec sp_executesql @strTmp,N'@TotalCounts int out ',@TotalCounts out end -- query all data IF @PageNumber < 1 SET @PageNumber = 1 if @PageSize = 0 begin if @Sort = '' begin set @sql = 'select ' + @Fields + ' from ' + @Tables + ' WHERE ' + @strFilter end else begin set @sql = 'select ' + @Fields + ' from ' + @Tables + ' WHERE ' + @strFilter + ' ORDER BY '+ @Sort end end else begin if @PageNumber = 1 -- the first page improves performance begin if @Sort = '' begin set @sql = 'select top ' + str(@PageSize) +' '+@Fields+ ' from ' + @Tables + ' WHERE ' + @strFilter end else begin set @sql = 'select top ' + str(@PageSize) +' '+@Fields+ ' from ' + @Tables + ' WHERE ' + @strFilter + ' ORDER BY '+ @Sort end end else begin DECLARE @START_ID varchar(50) DECLARE @END_ID varchar(50) SET @START_ID = convert(varchar(50),(@PageNumber - 1) * @PageSize + 1) SET @END_ID = convert(varchar(50),@PageNumber * @PageSize) if @Sort = '' begin set @sql = ' SELECT * FROM ( ' + ' SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS rownum, ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strFilter + ') AS D WHERE rownum BETWEEN ' + @START_ID + ' AND ' + @END_ID end else begin set @sql = ' SELECT * FROM ( ' + ' SELECT ROW_NUMBER() OVER(ORDER BY ' + @Sort + ') AS rownum, ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strFilter + ') AS D WHERE rownum BETWEEN ' + @START_ID + ' AND ' + @END_ID end END END PRINT @sql EXEC(@sql) GO
2. The method of calling the stored procedure
public class PageData { /// <summary> /// New page to get data /// </summary> /// <param name="tableName"></param> /// <param name="fieldName"></param> /// <param name="pageSize"></param> /// <param name="currentPage"></param> /// <param name="sortField">sort field and sort direction, such as: SortA DESC;</param> /// <param name="condition"></param> /// <param name="isCount">Whether to query the total number</param> /// <param name="totalCount">The total number of records queried</param> /// <returns></returns> public static DataSet GetDataByPage( string tableName, string fieldName, int pageSize, int currentPage, string sortField, string condition, bool isCount, out int totalCount ) { SqlConnection CONN = new SqlConnection("Database connection string"); SqlDataAdapter SDA = new SqlDataAdapter("p_PageList",CONN); SDA.SelectCommand.CommandType = CommandType.StoredProcedure; SDA.SelectCommand.CommandTimeout = 30000; SDA.SelectCommand.Parameters.Add("@Tables", SqlDbType.VarChar,1000).Value = tableName; SDA.SelectCommand.Parameters.Add("@Sort", SqlDbType.VarChar,200).Value = sortField; SDA.SelectCommand.Parameters.Add("@PageNumber", SqlDbType.Int).Value = currentPage ; SDA.SelectCommand.Parameters.Add("@PageSize", SqlDbType.Int).Value = pageSize; SDA.SelectCommand.Parameters.Add("@Fields", SqlDbType.VarChar,1000).Value = fieldName; SDA.SelectCommand.Parameters.Add("@Filter", SqlDbType.VarChar, 2000).Value = condition; SDA.SelectCommand.Parameters.Add("@Group", SqlDbType.VarChar,1000).Value = null; SDA.SelectCommand.Parameters.Add("@isCount", SqlDbType.Bit).Value = isCount; SDA.SelectCommand.Parameters.Add("@TotalCounts", SqlDbType.Int).Direction = ParameterDirection.Output; DataSet ds = new DataSet(); if (CONN.State == ConnectionState.Closed) { CONN.Open(); } SDA.Fill(ds); if (CONN.State == ConnectionState.Open) { CONN.Close(); } try { totalCount =int.Parse(SDA.SelectCommand.Parameters["@TotalCounts"].Value.ToString()); } catch { totalCount = 0; } return ds; }