系统通用分页过程
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
--***********************************************************************
--* 名 称:UTIL_GetOnePage
--* 功 能:系统通用分页过程
--* 作 者:
--* 日 期:2007-05-22
--* 说 明:排序字段只能是一列或空
--* 返 回 值:
--* 修 改:--***********************************************************************
ALTER PROCEDURE [dbo].[UTIL_GetOnePage]
@TableName VARCHAR(255), --表名(视图名)
@ListFields VARCHAR(8000) = '*' , --需要返回的列,默认全部列
@WhereCause VARCHAR(8000) = '', --查询条件,不要加'where',默认无
@OrderField VARCHAR(255) = '1', --排序的字段名,不要加'order by',默认不排序
@OrderType VARCHAR(4) = 'ASC', --设置排序类型,默认升序
@GetCount INT = 0, --0返回全部记录, 非0值则返回页记录集,默认全部
@PageSize INT = 10, --页尺寸,默认10
@PageIndex INT = 1 --页码,默认第一页
AS
BEGIN
SET NOCOUNT ON
DECLARE @strSQL VARCHAR(8000) --动态sql语句
DECLARE @S NVARCHAR(2000)
DECLARE @COUNT BIGINT
DECLARE @TOP BIGINT --标志变量(0.中间页;>0.尾页;<0超出页码范围)
--格式化传入的参数
SET @TableName = LTRIM(RTRIM(@TableName))
SET @ListFields = LTRIM(RTRIM(ISNULL(@ListFields,'*')))
SET @WhereCause = LTRIM(RTRIM(ISNULL(@WhereCause,'')))
SET @OrderField = LTRIM(RTRIM(ISNULL(@OrderField,'1')))
SET @OrderType = LTRIM(RTRIM(ISNULL(@OrderType,'ASC')))
--不是最后的页
SET @TOP = 0
--限制分页的条目数<100000
IF (@PageSize <= 0) OR (@PageSize > 100000)
SET @PageSize = 10
--限制非法页码
IF @PageIndex < = 0
SET @PageIndex = 1
--若果不指明排序字段,默认依据列表的第一列;可以再优化
IF @OrderField = ''
SET @OrderField = '1'
--需要返回的列,默认全部列
IF @ListFields = ''
SET @ListFields = '*'
--构建WHEER条件语句
IF @WhereCause <> ''
SET @WhereCause = ' WHERE ' + @WhereCause + ' '
--构建ASC条件语句
IF @OrderType NOT IN ('ASC','DESC')
SET @OrderType = 'ASC'
--如果仅要求查出总条数,则根据where语句查询后返回!
IF @GetCount = 0
BEGIN
SET @strSQL = 'SELECT COUNT(*) FROM ' + @TableName + ' ' + @WhereCause
EXEC (@strSQL)
RETURN
END
--进行分页查询
ELSE
BEGIN
--确定是否是最后一页且取出最后一页应该取出的条目数
IF @PageIndex > 1
BEGIN
SET @S = N'SELECT COUNT(*) FROM ' + @TableName + ' ' + @WhereCause
CREATE TABLE #T(C BIGINT)
INSERT INTO #T(C)
EXEC(@S)
SELECT @COUNT = C FROM #T
DROP TABLE #T
--EXEC SP_EXECUTESQL @S,N'@C BIGINT OUTPUT',@COUNT OUTPUT
IF (@COUNT > @PageSize) AND (@PageIndex > 1)
BEGIN
IF(@COUNT > @PageSize * (@PageIndex - 1)) AND (@COUNT < @PageSize * @PageIndex)
SET @TOP = @COUNT - @PageSize * (@PageIndex - 1)
ELSE IF (@COUNT < @PageSize * (@PageIndex - 1))
SET @TOP = -1
END
END
--如果是第一页
IF @PageIndex = 1
SET @strSQL = 'SELECT TOP ' + CAST(@PageSize AS VARCHAR(20)) + ' ' + @ListFields + ' '
+ 'FROM ' + @TableName + ' ' + @WhereCause + ' '
+ 'ORDER BY ' + @OrderField + ' ' + @OrderType --源顺序
--其他页
ELSE
BEGIN
--超出页码范围
IF @TOP < 0
SET @strSQL = 'SELECT ' + @ListFields + ' '
+ 'FROM ' + @TableName + ' '
+ 'WHERE 0 > 1 '
--最后一页
ELSE IF @TOP > 0
SET @strSQL = 'SELECT * FROM ('
+ 'SELECT TOP ' + CAST(@TOP AS VARCHAR(20)) + ' ' + @ListFields + ' '
+ 'FROM ' + @TableName + ' ' + @WhereCause + ' '
+ 'ORDER BY ' + @OrderField + ' ' + (CASE @OrderType WHEN 'ASC' THEN 'DESC' ELSE 'ASC' END) --倒序
+ ') T '
+ 'ORDER BY ' + @OrderField + ' ' + @OrderType --源顺序
--中间的页
ELSE
SET @strSQL = 'SELECT * '
+ 'FROM ('
+ 'SELECT TOP ' + CAST(@PageSize AS VARCHAR(20)) + ' * '
+ 'FROM '
+ '('
+ 'SELECT TOP ' + CAST(@PageSize * @PageIndex AS VARCHAR(20)) + ' ' + @ListFields + ' '
+ 'FROM ' + @TableName + ' ' + @WhereCause + ' '
+ 'ORDER BY ' + @OrderField + ' ' + @OrderType --源顺序
+ ') T '
+ 'ORDER BY ' + @OrderField + ' ' + (CASE @OrderType WHEN 'ASC' THEN 'DESC' ELSE 'ASC' END) --倒序
+ ') M '
+ 'ORDER BY ' + @OrderField + ' ' + @OrderType --源顺序
END
END
--执行构建语句,返回结果集
--SELECT @strSQL
EXEC (@strSQL)
SET NOCOUNT ON
END
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
--***********************************************************************
--* 名 称:UTIL_GetOnePage2
--* 功 能:系统通用分页过程(依据唯一索引列排序)
--* 作 者:
--* 日 期:2007-05-22
--* 说 明:排序字段只能是一个字段;所用的表只能是一个表,如果应用多个表,需写成视图;
--* 排序方式为(ASC.升序;DESC.降序);条件不要加where字样
--* 排序字段只能是一个字段必须是主键
--* 返 回 值:
--***********************************************************************
ALTER PROCEDURE [dbo].[UTIL_GetOnePage2]
@TABLE VARCHAR(255), --所用到的表,一个表或视图
@COL VARCHAR(8000), --要显示的字段列表
@WHERE VARCHAR(8000) , --所用到的条件,不含 where
@OKEY VARCHAR(255) , --排序字段,排序字段必须为主键或建立索引。
@ORDER VARCHAR(4) = 'ASC', --排序方式
@GetCount INT = 0, --0返回记录总数 非0值则返回页记录集,默认全部
@PAGESIZE INT = 10, --每页的行数
@PAGEINDEX INT = 1 --第n页
AS
BEGIN
DECLARE @CMDSTR VARCHAR(8000) --执行语句变量
DECLARE @WhereCause VARCHAR(8000) --WHERE子查询语句变量
DECLARE @WhereOrder VARCHAR(8000) --WHERE及ORDER子句
SET NOCOUNT ON
SET @ORDER = UPPER(LTRIM(RTRIM(@ORDER)))
--构建WHEER条件语句及WHERE子查询条件
IF RTRIM(LTRIM(@WHERE)) <> ''
BEGIN
SET @WhereCause = ' WHERE ' + @WHERE + ' '
SET @WhereOrder = ' AND ' + @WHERE + ' ORDER BY ' + @OKEY + ' ' + @ORDER
END
ELSE
BEGIN
SET @WhereCause = ' '
SET @WhereOrder = ' ORDER BY ' + @OKEY + ' ' + @ORDER
END
--如果仅要求查出总条数,则根据where语句查询后返回
IF @GetCount = 0
BEGIN
SET @CMDSTR = ' '
SET @CMDSTR = ' SELECT COUNT(*) As Total FROM ' + @TABLE + ' ' + @WhereCause
EXEC (@CMDSTR) --AS USER = 'dbo'
RETURN
END
--构建SELECT TOP (N) (LISTFIELDS) FROM (TABLE) (WHERE) (ORDER) 及 (WHERE 子查询)
--如果不是第一页,
IF @PAGEINDEX > 1
BEGIN
IF UPPER(LTRIM(RTRIM(@ORDER))) = 'ASC'
SET @CMDSTR=
' SELECT TOP ' + CONVERT(NVARCHAR(16),@PAGESIZE) + ' ' + @COL +
' FROM ' + @TABLE +
' WHERE ' + @OKEY + '>' +
' (SELECT MAX (' + @OKEY + ') ' +
'FROM (SELECT TOP '
ELSE
SET @CMDSTR=
' SELECT TOP ' + CONVERT(NVARCHAR(16),@PAGESIZE) + ' ' + @COL +
' FROM ' + @TABLE +
' WHERE ' + @OKEY + '<' +
' (SELECT MIN (' + @OKEY + ') ' +
'FROM (SELECT TOP '
SET @CMDSTR = @CMDSTR + CONVERT(NVARCHAR,(@PAGEINDEX-1) * @PAGESIZE) + ' ' + @OKEY + ' FROM ' + @TABLE + + ' ' + @WhereCause + ' ORDER BY ' + @OKEY + ' ' + @ORDER + ') AS T) ' + @WhereOrder
END
ELSE
SET @CMDSTR = ' SELECT TOP ' + CONVERT(NVARCHAR(16),@PAGESIZE) + ' ' + @COL + ' FROM ' + @TABLE + ' ' + @WhereCause + ' ORDER BY ' + @OKEY + ' ' + @ORDER
--select @CMDSTR
--SELECT @CMDSTR
--执行构建语句,返回结果集
EXEC(@CMDSTR) --AS USER = 'dbo'
SET NOCOUNT OFF
END
作者:过错
出处:http://www.cnblogs.com/wang2650/
关于作者:net开发做的久而已。十余年时光虚度!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:wang2650@163.com
联系我,非常感谢。