针对SQL 2000 的分页存储过程代码分享

所属分类: 数据库 / MsSql 阅读数: 614
收藏 0 赞 0 分享
复制代码 代码如下:

----------------------------------------------------
--针对SQL 2000 的分页存储过程
--Time:2008-9-25
----------------------------------------------------
ALTER PROCEDURE [dbo].[uoSp_RecordPager]
--要分页显示的表名,可多表连查,但不能使用别名。
--例:uo_Article LEFT JOIN uo_ArticleClass ON uo_Article.AClassID=uo_ArticleClass.ID
@Table_info varchar(100),

--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@field_id nvarchar(1000),

--要显示的页码
@CurrentPage int=1,

--每页的大小(记录数)
@PageSize int=10,

--以逗号分隔的要显示的字段列表,如果不指定,则为*。但多表联查时,若有同名字段,则必须显示指定要查的字段。
--例:uo_Article.*,uo_ArticleClass.ClassName
@Field_info nvarchar(1000),

--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序顺序
@Field_Order nvarchar(1000)= ' ',

--查询条件
@otherwhere nvarchar(1000)= ' ',
@RecordCount int OUTPUT, --总行数
@PageCount int OUTPUT, --总页数
@SQLSTR nvarchar(2000) output
AS
SET NOCOUNT ON

--分页字段检查
IF ISNULL(@field_id,N' ')= ' '
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键) ',1,16)
RETURN
END

--其他参数检查及规范
IF ISNULL(@PageSize,0) <1 SET @PageSize=10
IF ISNULL(@Field_info,N' ')=N' ' SET @Field_info=N'* '
IF ISNULL(@Field_Order,N' ')=N' '
SET @Field_Order=N' '
ELSE
SET @Field_Order=N'ORDER BY '+LTRIM(@Field_Order)

IF ISNULL(@otherwhere,N' ')=N' '
SET @otherwhere=N' '
ELSE
SET @otherwhere=N' WHERE ('+@otherwhere+N') '

--计算@RecordCount
declare @sqlt nvarchar(1000)
set @sqlt = 'SELECT @RecordCount = COUNT(' + @Field_id + ') FROM ' + @Table_Info + @otherwhere
exec sp_executesql @sqlt,N'@RecordCount int output',@RecordCount output

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
IF @PageCount IS NULL
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @PageCount=COUNT(*) '
+N' FROM '+@Table_info
+N' '+@otherwhere
EXEC sp_executesql @sql,N'@PageCount int OUTPUT ',@PageCount OUTPUT
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

IF ISNULL(@CurrentPage,0) <1 SET @CurrentPage=1
IF @CurrentPage > @PageCount and @PageCount>0 SET @CurrentPage=@PageCount

--第一页直接显示
IF @CurrentPage = 1
BEGIN
SET @SQLSTR = N'SELECT TOP ' + str(@PageSize) +N' '+@Field_info +N' FROM '+@Table_info +N' '+@otherwhere +N' '+@Field_Order
--PRINT @SQLSTR
EXEC(@SQLSTR)
END
ELSE
BEGIN
----------------------------------------------------
--获取第一个表的表名
DECLARE @FirstTableName varchar(20)
SET @FirstTableName = @Table_info
IF CHARINDEX(N',',@FirstTableName)>0 OR CHARINDEX(N'.',@FirstTableName)> 0 OR CHARINDEX(N' ',@FirstTableName)> 0
BEGIN
WHILE CHARINDEX(N',',@FirstTableName)> 0
SELECT @FirstTableName=LEFT(@FirstTableName,CHARINDEX(N',',@FirstTableName)-1)
WHILE CHARINDEX(N'.',@FirstTableName)> 0
SELECT @FirstTableName=LEFT(@FirstTableName,CHARINDEX(N'.',@FirstTableName)-1)
WHILE CHARINDEX(N' ',@FirstTableName)> 0
SELECT @FirstTableName=LEFT(@FirstTableName,CHARINDEX(N' ',@FirstTableName)-1)
END

--构造SQL语句
SET @SQLSTR = N'SELECT * FROM ('
+ N' SELECT TOP '+STR(@PageSize*@CurrentPage) +N' '+ @Field_info + N' FROM '+@Table_info +N' '+@otherwhere +N' '+@Field_Order
+ N') '+@FirstTableName+N' WHERE '+@field_id+N' NOT IN ('
+ N' SELECT TOP '+STR(@PageSize*(@CurrentPage-1))+N' '+ @field_id + N' FROM '+@Table_info +N' '+@otherwhere +N' '+@Field_Order
+ N') '
+ N' '+@Field_Order
EXEC(@SQLSTR)
----------------------------------------------------
END
更多精彩内容其他人还在看

sql 分组查询问题

sql 分组查询问题,需要的朋友可以参考下。
收藏 0 赞 0 分享

MSSQL 数据库备份和还原的几种方法 图文教程

MSSQL 数据库备份和还原的几种方法小结,配有图文,大家看了就知道了。
收藏 0 赞 0 分享

GridView自定义分页的四种存储过程

首先要说说为什么不用GridView的默认的分页功能,GridView控件并非真正知道如何获得一个新页面,它只是请求绑定的数据源控件返回适合规定页面的行,分页最终是由数据源控件完成。
收藏 0 赞 0 分享

Godaddy 导入导出MSSQL数据库的实现步骤

可以从限制文件中导入SQL共享服务器数据库。如果想把存放在其他地方的数据导入,需要先把其内容拷到限制文件中。(
收藏 0 赞 0 分享

得到自增列的下一个会插入的id

怎么得到自增列的下一个会插入的id
收藏 0 赞 0 分享

几个简单的基本的sql语句

这个是从网上看到的。。。COPY一下。。有时候忘记了。。
收藏 0 赞 0 分享

sqlserver 自动备份所有数据库的SQL

可自动备份除系统数据库外的所有数据库。备份文件的周期保存周期可以更改。
收藏 0 赞 0 分享

SQL Server 服务器优化技巧浅谈

数据文件和日志文件的操作会产生大量的I/O。在可能的条件下,日志文件应该存放在一个与数据和索引所在的数据文件不同的硬盘上以分散I/O,同时还有利于数据库的灾难恢复。
收藏 0 赞 0 分享

sql2005 存储过程分页示例代码

sql2005分页存储过程示例
收藏 0 赞 0 分享

union组合结果集时的order问题

如果能确定各查询结果不会有重复的项,最好就带上all,因为这样还是可以提高一些效率的。
收藏 0 赞 0 分享
查看更多