首 页 | 精品电影 | 音乐天堂 | 在线游戏 | Flash MTV | 三湘书屋 | 幽默笑话 | 三湘图库 | 美女写真 | IT知识库 | QQ贴图 | 加入书签

网页制作网络编程图形图象操作系统冲浪宝典软件教学网络安全认证考试通信技术电子商务业内动态书籍教程原码

最近更新 文章分类 多媒体类 精品软件

本站搜索:
您的位置:三湘时空 -> IT知识库 -> 文章分类 -> 数据库技巧 -> 两个数据分页的存储过程
两个数据分页的存储过程


文章类别:数据库技巧 来源: 作者: 发表日期:2006-9-8 字体:[ ]

小游戏 | 在线影院 | 幽默笑话 | 源码下载 | Flash MTV | 音乐试听 | 书屋 | 美女写真

1. 按某个特定表查询的存储过程:
CREATE PROCEDURE GetPagingData_bigfun
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

if @doCount != 0
 begin
 if @strWhere !=''
  set @strSQL = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere
 else
  set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
 end
 --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况:
else
 begin
 if @OrderType != 0 --如果@OrderType不是0,就执行降序,这句很重要!
  begin
  set @strTmp = '<(select min'
  set @strOrder = ' order by [' + @fldName +'] desc' 
  end
 else
  begin
  set @strTmp = '>(select max'
  set @strOrder = ' order by [' + @fldName +'] asc'
  end

 if @PageIndex = 1 --如果是第一页就执行以上代码,这样会加快执行速度
  begin
  if @strWhere != ''
   set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
  else
   set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder
  end
 else
  begin --以下代码赋予了@strSQL以真正执行的SQL代码 
   if @strWhere != ''''
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
   else
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '"] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder
  end

 end
exec (@strSQL)
GO
2. 按提供的SQL语句进行的分页(使用了游标)
CREATE procedure p_splitpage
@sql nvarchar(4000),--要执行的sql语句
@page int=1, --要显示的页码
@pageSize int,--每页的大小
@pageCount int=0 out,--总页数
@recordCount int=0 out,--总记录数
@SearchTime int=0 out
as
declare @usetime datetime
set @usetime=getdate()
set nocount on
declare @p1 int
exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
set @recordCount = @pageCount
select @pagecount=ceiling(1.0*@pagecount/@pagesize)
,@page=(@page-1)*@pagesize+1
exec sp_cursorfetch @p1,16,@page,@pagesize
exec sp_cursorclose @p1
set  @SearchTime=datediff(ms,@usetime,getdate())
print @SearchTime
GO

上述两个存储过程中,第一个使用特定的表,不利于多表的联合查询;后者由于使用了游标,执行的速度上不如前者.

http://www.cnblogs.com/bigfun4000/archive/2006/09/07/497553.html

上一篇:编程使用资源文件实现多语言页面(In Action) 下一篇:根据html页面模板动态生成html页面(c#类)
本栏目热门文章
·Windows XP下安装SQL2000企业版 2005-10-4
·在SQL Server 2000里设置和使用数据库复制 2005-11-13
·SQL SERVER实用技巧 2005-11-3
·SQL Server 数据库管理常用的SQL和T-SQL语句 2005-11-13
·SQL中通配符、转义符与"["号的使用(downmoon) 2005-11-3
·配置SQL Server 2000选项 2005-10-8
·如何使Microsoft SQL Server的日志文件不会增大? 2005-10-4
·Sql Server下数据库链接的使用方法 2005-11-21
·如何快速杀死占用过多资源(CPU,内存)的数据库进程 2005-11-13
·使用SQL Server导入和索引 Microsoft Word 文 2005-10-4
新近更新文章
·SQL Server: convert varbinary to v 2006-9-14
·log4net和SQL Server 2000 2006-9-14
·一個Select出一個表中第N條記錄的Sql代碼 2006-9-14
·SQL Artisan 1.3功能使用介绍 2006-9-14
·两个数据分页的存储过程 2006-9-8
·MS SQL Server 2000系统数据类型 2006-9-8
·sql server转换时间为字符串 2006-9-8
·MySQL账户相关 2006-9-8
·SQL SERVER 2005 同步复制技术 2006-9-8
·通用分页存储过程,源码共享,大家共同完善 2006-9-1
首 页 | 软件发布 | 广告联系 | 下载帮助 | 意见反馈 | 网站地图
  CopyRight? 2002-2004 WWW.SXSKY.NET? All Rights Reserved
三湘时空 站长QQ:82675303 Email: