MsSql通用存储过程分页
时间:2011-03-20 来源:Macbeth
啥也不说了,贴代码
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
相关阅读 更多 +