您的位置:首页 > 其它

存储过程实现分页

2016-07-10 15:28 302 查看
CREATE PROCEDURE [dbo].[sp_page]
@strTable           VARCHAR(1000),       --表名
@strColumn        VARCHAR(100),       --按该列来进行分页,多表链接的时候要填写表名、列名、排序方式(table:column [ASC | DESC])
@strColumn2      VARCHAR(100),       --按该列来进行分页,只需要填写列名、排序方式(column [ASC | DESC])
@intOrder           BIT,                           --排序,0-顺序,1-倒序
@strColumnlist    VARCHAR(800),       --要查询出的字段列表,*表示全部字段
@intPageSize     INT,                          --每页记录数
@intPageNum    INT,                          --指定页
@strWhere         VARCHAR(800),       --查询条件
@intPageCount  INT   OUTPUT         --总页数
AS
DECLARE   @sql            NVARCHAR(4000)   --用于构造SQL语句
DECLARE   @where1     VARCHAR(800)       --构造条件语句
DECLARE   @orderby1     VARCHAR(800)       --构造条件语句
DECLARE   @count       INT                           --记录符合条件的总条数

IF   @strWhere   is   null   or   rtrim(@strWhere)=''
-- 为了避免SQL关键字与字段、表名等连在一起,首先为传入的变量添加空格
BEGIN  --没有查询条件
SET   @where1='  '
END
ELSE
BEGIN  --有查询条件
SET   @where1='  WHERE  ('+@strWhere+')  '
END

SET @orderby1 = LOWER(@strColumn)
IF CHARINDEX(',',@orderby1) <> 0
BEGIN
IF CHARINDEX('desc', @orderby1) = 0
BEGIN
SET  @orderby1=REPLACE(@orderby1, 'asc', 'desc');
END
ELSE
BEGIN
SET  @orderby1=REPLACE(@orderby1, 'desc', 'asc');
END
END

SET  @strColumn = ' ' + @strColumn + ' '
SET  @strColumnlist = ' ' + @strColumnlist + ' '

--计算符合记录的总条数。
SET   @sql='SELECT @count=COUNT(*)  FROM  ' + @strTable + @where1
EXEC sp_executesql  @sql, N'@count   int   OUTPUT', @count   OUTPUT

--构造SQL语句,计算总页数。计算公式为 总页数 = Ceiling ( 记录个数 / 页大小 )
--SET   @sql='SELECT   @intPageCount=CEILING((COUNT(*)+0.0)/' + CAST(@intPageSize   AS   varchar)+ ')   FROM  ' + @strTable + @where1

--执行SQL语句,计算总页数,并将其放入@intPageCount变量中
--EXEC sp_executesql  @sql, N'@intPageCount   int   OUTPUT', @intPageCount   OUTPUT

set @intPageCount=CEILING ((@count+ 0.0) /@intPageSize)

--如果@intOrder=1为倒序,@intOrder=0为升序
IF @intOrder=1
BEGIN
SET @sql='SELECT TOP ' + CAST(@intPageSize  AS varchar)
+  ' * FROM ( SELECT TOP ' + CAST(( @count  - (@intPageSize *  (@intPageNum - 1) ) )  AS varchar)
+ @strColumnlist +'  FROM ' + @strtable +  @where1
+'ORDER BY '+@orderby1+' DESC) T20070311  ORDER BY ' + @strColumn2
END
ELSE
BEGIN
SET @sql='SELECT TOP ' + CAST(@intPageSize  AS varchar)
+  ' * FROM ( SELECT TOP ' + CAST(( @count  - (@intPageSize *  (@intPageNum - 1) ) )  AS varchar)
+ @strColumnlist +'  FROM ' + @strtable +  @where1
+'ORDER BY '+@orderby1+' ) T20070311  ORDER BY ' + @strColumn2 + ' DESC'
END
--print @sql
EXEC(@sql)
GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储过程 分页