| 
                         首先看下面的代码创建存储过程 
1、创建存储过程,语句如下:
10 and len(userid)>9
 @Order VARCHAR(1000),--排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc     
               --注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷
 @SortType INT,--排序规则 1:正序asc 2:倒序desc 3:多列排序方法
 @RecorderCount INT,--记录总数 0:会返回总记录
 @PageSize INT,--每页输出的记录数
 @PageIndex INT,--当前页数
 @TotalCount INT OUTPUT,--记返回总记录
 @TotalPageCount INT OUTPUT  --返回总页数
AS
 SET NOCOUNT ON
IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0 
SET @Order = RTRIM(LTRIM(@Order)) 
SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey)) 
SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','') 
WHILE CHARINDEX(',',@Order) > 0 OR CHARINDEX(',@Order) > 0 
BEGIN 
SET @Order = REPLACE(@Order,') 
SET @Order = REPLACE(@Order,') 
END 
IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = '' 
OR ISNULL(@PrimaryKey,'') = '' 
OR @SortType < 1 OR @SortType >3 
OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0 
BEGIN 
PRINT('ERR_00') 
RETURN 
END  
IF @SortType = 3 
BEGIN 
IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC') 
BEGIN PRINT('ERR_02') RETURN END 
END 
DECLARE @new_where1 VARCHAR(1000) 
DECLARE @new_where2 VARCHAR(1000) 
DECLARE @new_order1 VARCHAR(1000) 
DECLARE @new_order2 VARCHAR(1000) 
DECLARE @new_order3 VARCHAR(1000) 
DECLARE @Sql VARCHAR(8000) 
DECLARE @SqlCount NVARCHAR(4000) 
IF ISNULL(@where,'') = '' 
BEGIN 
SET @new_where1 = ' ' 
SET @new_where2 = ' WHERE ' 
END 
ELSE 
BEGIN 
SET @new_where1 = ' WHERE ' + @where 
SET @new_where2 = ' WHERE ' + @where + ' AND ' 
END 
IF ISNULL(@order,'') = '' OR @SortType = 1 OR @SortType = 2 
BEGIN 
IF @SortType = 1 
BEGIN 
SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' ASC' 
SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' DESC' 
END 
IF @SortType = 2 
BEGIN 
SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' DESC' 
SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' ASC' 
END 
END 
ELSE 
BEGIN 
SET @new_order1 = ' ORDER BY ' + @Order 
END 
IF @SortType = 3 AND CHARINDEX(','+@PrimaryKey+' ','+@Order)>0 
BEGIN 
SET @new_order1 = ' ORDER BY ' + @Order 
SET @new_order2 = @Order + ',' 
SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,'{ASC},'),'DESC,'{DESC},') 
SET @new_order2 = REPLACE(REPLACE(@new_order2,') 
SET @new_order2 = ' ORDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1) 
IF @FieldList <> '*' 
BEGIN 
SET @new_order3 = REPLACE(REPLACE(@Order + ',') 
SET @FieldList = ',' + @FieldList 
WHILE CHARINDEX(',@new_order3)>0 
BEGIN 
IF CHARINDEX(SUBSTRING(','+@new_order3,CHARINDEX(',@new_order3)),'+@FieldList+',')>0 
BEGIN 
SET @FieldList = 
@FieldList + ',' + SUBSTRING(@new_order3,@new_order3)) 
END 
SET @new_order3 = 
SUBSTRING(@new_order3,@new_order3)+1,LEN(@new_order3)) 
END 
SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList)) 
END 
END 
SET @SqlCount = 'SELECT @TotalCount=COUNT(),@TotalPageCount=CEILING((COUNT()+0.0)/' 
- CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1
 
IF @RecorderCount = 0 
BEGIN 
EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',@TotalCount OUTPUT,@TotalPageCount OUTPUT 
END 
ELSE 
BEGIN 
SELECT @TotalCount = @RecorderCount 
END 
 
IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize) 
BEGIN 
SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize) 
END 
IF @PageIndex = 1 OR @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize) 
BEGIN 
IF @PageIndex = 1 --返回第一页数据 
BEGIN 
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '  
- @TableName + @new_where1 + @new_order1
 
END 
IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize) --返回最后一页数据 
BEGIN 
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('  
- 'SELECT TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize)) 
 
- ' ' + @FieldList + ' FROM '
 
- @TableName + @new_where1 + @new_order2 + ' ) AS TMP '
 
- @new_order1
 
END 
END 
ELSE 
BEGIN 
IF @SortType = 1 --仅主键正序排序 
BEGIN 
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 
BEGIN 
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 
- @TableName + @new_where2 + @PrimaryKey + ' > '
 
- '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '
 
- STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey 
 
- ' FROM ' + @TableName
 
- @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1
 
END 
ELSE --反向检索 
BEGIN 
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('  
- 'SELECT TOP ' + STR(@PageSize) + ' ' 
 
- @FieldList + ' FROM '
 
- @TableName + @new_where2 + @PrimaryKey + ' < '
 
- '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
 
- STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey 
 
- ' FROM ' + @TableName
 
- @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2 
 
- ' ) AS TMP ' + @new_order1
 
END 
END 
IF @SortType = 2 --仅主键反序排序 
BEGIN 
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 
BEGIN 
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '  
- @TableName + @new_where2 + @PrimaryKey + ' < '
 
- '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
 
- STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
 
+' FROM '+ @TableName 
- @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1
 
END 
ELSE --反向检索 
BEGIN 
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('  
- 'SELECT TOP ' + STR(@PageSize) + ' ' 
 
- @FieldList + ' FROM '
 
- @TableName + @new_where2 + @PrimaryKey + ' > '
 
- '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '
 
- STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey 
 
- ' FROM ' + @TableName
 
- @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2 
 
- ' ) AS TMP ' + @new_order1
 
END 
END 
IF @SortType = 3 --多列排序,必须包含主键,且放置最后,否则不处理 
BEGIN 
IF CHARINDEX(',' + @PrimaryKey + ' ',' + @Order) = 0 
BEGIN PRINT('ERR_02') RETURN END 
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 
BEGIN 
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 
- 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
 
- ' SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList
 
- ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '
 
- @new_order2 + ' ) AS TMP ' + @new_order1
 
END 
ELSE --反向检索 
BEGIN 
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '  
- 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
 
- ' SELECT TOP ' + STR(@TotalCount-@PageSize*@PageIndex+@PageSize) + ' ' + @FieldList
 
- ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '
 
- @new_order1 + ' ) AS TMP ' + @new_order1
 
END 
END 
END 
PRINT(@Sql) 
EXEC(@Sql) 
GO
2、SQL Server 中调用测试代码
  
 
 
declare @TotalCount int,@TotalPageCount int 
exec P_viewPage 'T_Module','*','ModuleID','',10,@TotalCount output,@TotalPageCount output 
Select @TotalCount,@TotalPageCount; 
asp.net 代码实现:
  /// 通用分页存储过程
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  ///  
  public static DataSet PageList(string connectionString,string tblName,string strGetFields,string primaryKey,string strWhere,string strOrder,int sortType,int recordCount,int PageSize,int PageIndex,ref int totalCount,ref int totalPageCount)
  {
 SqlParameter[] parameters ={ new SqlParameter("@TableName ",SqlDbType.VarChar,200),new SqlParameter("@FieldList",2000),new SqlParameter("@PrimaryKey",100),new SqlParameter("@Where",new SqlParameter("@Order",1000),new SqlParameter("@SortType",SqlDbType.Int),new SqlParameter("@RecorderCount",new SqlParameter("@PageSize",new SqlParameter("@PageIndex",new SqlParameter("@TotalCount",new SqlParameter("@TotalPageCount",SqlDbType.Int)};
                         (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |