MsSql通用存储过程分页

啥也不说了,贴代码

1 /****** Object: StoredProcedure [dbo].[ListPage] Script Date: 03/20/2011 23:26:56 ******/
2  SET ANSI_NULLS ON
3  GO
4 SET QUOTED_IDENTIFIER ON
5 GO
6 CREATE PROC [dbo].[ListPage]
7 @p_tableName VARCHAR(MAX),  --表名或者Sql语句
8 @p_columns VARCHAR(1000)='*',    --字段名称
9 @p_strWhere VARCHAR(1000)='',  --查询条件
10 @p_orderColumn VARCHAR(20),   --排序的列
11 @p_orderStyle VARCHAR(10)='asc',    --排序方式
12 @p_curPage INT OUTPUT,   --当前页
13 @p_pageSize INT OUTPUT,   --每页显示记录条数
14 @p_totalRecords INT OUTPUT, --总记录数
15 @p_totalPages INT OUTPUT    --总页数
16 AS
17 DECLARE @v_sql NVARCHAR(MAX) --sql语句
18 DECLARE @v_startRecord INT --开始显示的记录条数
19 DECLARE @v_endRecord INT --结束显示的记录条数
20 --记录中总记录条数
21 SET @v_sql = 'SELECT @A=COUNT(*) FROM ' + @p_tableName + ' WHERE 1=1';
22 IF (@p_strWhere IS NOT NULL or @p_strWhere <> '')
23 SET @v_sql = @v_sql +' '+ @p_strWhere;
24 EXEC sp_executesql @v_sql,N'@A INT OUTPUT',@p_totalRecords output
25 --验证页面记录大小
26 IF (@p_pageSize < 0)
27 SET @p_pageSize = 0
28
29 --根据页大小计算总页数
30 SELECT @p_totalPages=CEILING(CAST(@p_totalRecords AS FLOAT)/@p_pageSize)
31
32 --验证页号
33 IF @p_curPage < 1
34 SET @p_curPage= 1
35 IF @p_curPage > @p_totalPages
36 SET @p_curPage = @p_totalPages
37
38 --实现分页查询
39 SET @v_startRecord = (@p_curPage - 1) * @p_pageSize + 1;
40 SET @v_endRecord = @p_curPage * @p_pageSize;
41 SET @v_sql = 'SELECT '+@p_columns+' FROM (SELECT A.*, ROW_NUMBER() over('
42 IF @p_orderColumn IS NOT NULL or @p_orderColumn <> ''
43 SET @v_sql = @v_sql + ' ORDER BY ' + @p_orderColumn + ' ' +@p_orderStyle;
44 SET @v_sql=@v_sql+') r FROM (SELECT * FROM ' + @p_tableName;
45 IF @p_strWhere IS NOT NULL or @p_strWhere <> ''
46 SET @v_sql = @v_sql + ' WHERE 1=1' + @p_strWhere;
47
48 SET @v_sql= @v_sql + ') A ) B WHERE r <= ' + CAST(@v_endRecord AS VARCHAR) + ' AND r >= '+ CAST(@v_startRecord AS VARCHAR);
49 Exec(@v_sql);
50
posted @ 2011-03-20 23:30  Macbeth  阅读(521)  评论(3编辑  收藏  举报