Sql2000 版通用分页存储过程
2008-12-18 10:38
363 查看
CREATE PROCEDURE sys_QuickSortPaging
(
@Table nvarchar(4000), --表名(必须)
@PrimaryKeyField nvarchar(50), --表的主键字段
@Field nvarchar (4000)='*', --需要返回字段名(必须)
@Where nvarchar(1000)=NULL, --Where 条件(可选)
@GroupBy nvarchar(1000) = NULL, --分组
@OrderBy nvarchar(1000)=NULL, --排序用到的字段()
@PageNumber int = 1, --要返回的页(第X页) (默认为第一页)
@PageSize int = 10, --每页大小(默认为5)
@RecordCount int output --返回记录总数
)
AS
SET NOCOUNT ON
DECLARE @SortTable nvarchar(100)
DECLARE @SortName nvarchar(100)
DECLARE @strSortColumn nvarchar(200)
DECLARE @Operator nvarchar(50)
DECLARE @Type varchar(100)
DECLARE @Prec int
IF @OrderBy IS NULL OR @OrderBy = ''
SET @OrderBy = @PrimaryKeyField
/**//* 获取用于定位的字段*/
IF CHARINDEX('DESC',@OrderBy)>0
BEGIN
SET @strSortColumn = REPLACE(@OrderBy, 'DESC', '')
SET @Operator = '<='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @OrderBy) = 0
SET @strSortColumn = REPLACE(@OrderBy, 'ASC', '')
SET @Operator = '>='
END
IF CHARINDEX('.', @strSortColumn) > 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Table
SET @SortName = @strSortColumn
END
SELECT @Type=t.name, @Prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @Type) > 0
SET @Type = @Type + '(' + CAST(@Prec AS nvarchar) + ')'
DECLARE @strStartRow nvarchar(50)
DECLARE @strPageSize nvarchar(50)
DECLARE @strWhere nvarchar(1000)
DECLARE @strWhereAnd nvarchar(1000)
DECLARE @strGroupBy nvarchar(1000)
IF @PageNumber < 1
SET @PageNumber = 1
SET @strPageSize = CONVERT (nvarchar(50), @PageSize)
SET @strStartRow = CONVERT ( nvarchar(50), (@PageNumber - 1)*@PageSize + 1)
IF @Where IS NOT NULL AND @Where !=''
BEGIN
SET @strWhere = ' WHERE '+ @Where
SET @strWhereAnd= ' AND ' + @Where
END
ELSE
BEGIN
SET @strWhere = ''
SET @strWhereAnd=''
END
IF @GroupBy IS NOT NULL AND @GroupBy != ''
BEGIN
SET @strGroupBy = ' GROUP BY ' + @GroupBy
END
ELSE
BEGIN
SET @strGroupBy = ''
END
DECLARE @strSQL nvarchar(4000)
SET @strSql= ' SELECT @RecordCount = Count (*) FROM ' + @Table + @strWhere + ' ' + @strGroupBy
EXEC sp_executesql @strSql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT--计算总页数
EXEC
(
'
DECLARE @Sort ' + @Type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @Sort = ' + @strSortColumn + ' FROM ' + @Table + @strWhere + ' ' + @strGroupBy + ' ORDER BY ' + @OrderBy + '
SET ROWCOUNT ' + @strPageSize + '
SELECT '+@Field+' FROM ' + @Table + ' WHERE ' + @strSortColumn + @Operator + ' @Sort ' + @strWhereAnd + ' ' + @strGroupBy + ' ORDER BY ' + @OrderBy
)
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
(
@Table nvarchar(4000), --表名(必须)
@PrimaryKeyField nvarchar(50), --表的主键字段
@Field nvarchar (4000)='*', --需要返回字段名(必须)
@Where nvarchar(1000)=NULL, --Where 条件(可选)
@GroupBy nvarchar(1000) = NULL, --分组
@OrderBy nvarchar(1000)=NULL, --排序用到的字段()
@PageNumber int = 1, --要返回的页(第X页) (默认为第一页)
@PageSize int = 10, --每页大小(默认为5)
@RecordCount int output --返回记录总数
)
AS
SET NOCOUNT ON
DECLARE @SortTable nvarchar(100)
DECLARE @SortName nvarchar(100)
DECLARE @strSortColumn nvarchar(200)
DECLARE @Operator nvarchar(50)
DECLARE @Type varchar(100)
DECLARE @Prec int
IF @OrderBy IS NULL OR @OrderBy = ''
SET @OrderBy = @PrimaryKeyField
/**//* 获取用于定位的字段*/
IF CHARINDEX('DESC',@OrderBy)>0
BEGIN
SET @strSortColumn = REPLACE(@OrderBy, 'DESC', '')
SET @Operator = '<='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @OrderBy) = 0
SET @strSortColumn = REPLACE(@OrderBy, 'ASC', '')
SET @Operator = '>='
END
IF CHARINDEX('.', @strSortColumn) > 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Table
SET @SortName = @strSortColumn
END
SELECT @Type=t.name, @Prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @Type) > 0
SET @Type = @Type + '(' + CAST(@Prec AS nvarchar) + ')'
DECLARE @strStartRow nvarchar(50)
DECLARE @strPageSize nvarchar(50)
DECLARE @strWhere nvarchar(1000)
DECLARE @strWhereAnd nvarchar(1000)
DECLARE @strGroupBy nvarchar(1000)
IF @PageNumber < 1
SET @PageNumber = 1
SET @strPageSize = CONVERT (nvarchar(50), @PageSize)
SET @strStartRow = CONVERT ( nvarchar(50), (@PageNumber - 1)*@PageSize + 1)
IF @Where IS NOT NULL AND @Where !=''
BEGIN
SET @strWhere = ' WHERE '+ @Where
SET @strWhereAnd= ' AND ' + @Where
END
ELSE
BEGIN
SET @strWhere = ''
SET @strWhereAnd=''
END
IF @GroupBy IS NOT NULL AND @GroupBy != ''
BEGIN
SET @strGroupBy = ' GROUP BY ' + @GroupBy
END
ELSE
BEGIN
SET @strGroupBy = ''
END
DECLARE @strSQL nvarchar(4000)
SET @strSql= ' SELECT @RecordCount = Count (*) FROM ' + @Table + @strWhere + ' ' + @strGroupBy
EXEC sp_executesql @strSql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT--计算总页数
EXEC
(
'
DECLARE @Sort ' + @Type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @Sort = ' + @strSortColumn + ' FROM ' + @Table + @strWhere + ' ' + @strGroupBy + ' ORDER BY ' + @OrderBy + '
SET ROWCOUNT ' + @strPageSize + '
SELECT '+@Field+' FROM ' + @Table + ' WHERE ' + @strSortColumn + @Operator + ' @Sort ' + @strWhereAnd + ' ' + @strGroupBy + ' ORDER BY ' + @OrderBy
)
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
相关文章推荐
- sql2000及以上通用分页存储过程
- 分页存储过程 SQL2000以上通用
- 一个基于ROW_NUMBER()的通用分页存储过程代码
- 实现分页存储过程(SQL2000 SQL2005 Oracle )
- SQL Server的通用分页存储过程 未使用游标,速度更快!
- 通用分页查询存储过程
- 千万级通用的分页存储过程
- ORACLE通用分页存储过程及.NET调用方式
- 通用高效分页存储过程代码
- [百万级]通用存储过程.分页存储过程
- oracle 中通用的分页存储过程
- .net海量数据分页通用存储过程
- MS SQLSERVER通用存储过程分页
- 通用的分页存储过程
- [百万级]通用存储过程.分页存储过程
- 存储过程02-简单通用分页
- 通用分页存储过程——节省你的时间,延长程序员的寿命!
- [百万级]通用存储过程.分页存储过程(摘)
- 实现小数据量和海量数据的通用分页显示存储过程
- 通用分页存储过程