C#(CSharp)
|
VC/C++
|
C++Builder
|
ASP(ASP.NET)
|
SQL Server
|
OpenGL
|
CMM
|
网站开发SEO
|
数控技术
|
地理信息系统
|
WINDOWS操作系统
|
联高软件
>
技术文章
>
Web数据库开发
> 两种通用分页存储过程的对比
HTML与页面设计
|
CSS样式表
|
Web数据库开发
|
通用网络技术
|
通讯与手机开发
|
两种通用分页存储过程的对比
发表:联高软件www.legalsoft.com.cn,本文被阅读:
1
次
两种通用分页存储过程的对比
第一种:
CREATE PROCEDURE xsp_ination ( @tblName varchar(64), @strGetFields varchar(256) = "*", @fldName varchar(64)="", @PageSize int = 20, @PageIndex int = 1, @OrderType bit = 1, @strWhere varchar(512) = "" ) AS BEGIN declare @strSQL varchar(1000) declare @strTmp varchar(110) declare @strOrder varchar(400) SET NOCOUNT ON if @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 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 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 end EXEC (@strSQL) if @@error=0 return 1 SET NOCOUNT OFF END GO
优点:使用相对简单;
缺点:个别时候会出现数据查询结果不对。
CREATE PROC xsp_page @tbname sysname, --要分页显示的表名 @FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段 @PageCurrent int=1, --要显示的页码 @PageSize int=10, --每页的大小(记录数) @FieldShow nvarchar(1000)="", --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段 @FieldOrder nvarchar(1000)="", --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序 @Where nvarchar(1000)="" --查询条件 AS SET NOCOUNT ON --检查对象是否有效 IF OBJECT_ID(@tbname) IS NULL BEGIN RAISERROR(N"对象"%s"不存在",1,16,@tbname) RETURN END IF OBJECTPROPERTY(OBJECT_ID(@tbname),N"IsTable")=0 AND OBJECTPROPERTY(OBJECT_ID(@tbname),N"IsView")=0 AND OBJECTPROPERTY(OBJECT_ID(@tbname),N"IsTableFunction")=0 BEGIN RAISERROR(N""%s"不是表、视图或者表值函数",1,16,@tbname) RETURN END --分页字段检查 IF ISNULL(@FieldKey,N"")="" BEGIN RAISERROR(N"分页处理需要主键(或者惟一键)",1,16) RETURN END --其他参数检查及规范 IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1 IF ISNULL(@PageSize,0)<1 SET @PageSize=10 IF ISNULL(@FieldShow,N"")=N"" SET @FieldShow=N"*" IF ISNULL(@FieldOrder,N"")=N"" SET @FieldOrder=N"" ELSE SET @FieldOrder=N"ORDER BY "+LTRIM(@FieldOrder) IF ISNULL(@Where,N"")=N"" SET @Where=N"" ELSE SET @Where=N"WHERE ("+@Where+N")" --如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值) DECLARE @PageCount int IF @PageCount IS NULL BEGIN DECLARE @sql nvarchar(4000) SET @sql=N"SELECT @PageCount=COUNT(*)" +N" FROM "+@tbname +N" "+@Where EXEC sp_executesql @sql,N"@PageCount int OUTPUT",@PageCount OUTPUT SET @PageCount=(@PageCount+@PageSize-1)/@PageSize END --计算分页显示的TOPN值 DECLARE @TopN varchar(20),@TopN1 varchar(20) SELECT @TopN=@PageSize, @TopN1=(@PageCurrent-1)*@PageSize --第一页直接显示 IF @PageCurrent=1 EXEC(N"SELECT TOP "+@TopN +N" "+@FieldShow +N" FROM "+@tbname +N" "+@Where +N" "+@FieldOrder) ELSE BEGIN --处理别名 IF @FieldShow=N"*" SET @FieldShow=N"a.*" --生成主键(惟一键)处理条件 DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000), @s nvarchar(1000),@Field sysname SELECT @Where1=N"",@Where2=N"",@s=@FieldKey WHILE CHARINDEX(N",",@s)>0 SELECT @Field=LEFT(@s,CHARINDEX(N",",@s)-1), @s=STUFF(@s,1,CHARINDEX(N",",@s),N""), @Where1=@Where1+N" AND a."+@Field+N"=b."+@Field, @Where2=@Where2+N" AND b."+@Field+N" IS NULL", @Where=REPLACE(@Where,@Field,N"a."+@Field), @FieldOrder=REPLACE(@FieldOrder,@Field,N"a."+@Field), @FieldShow=REPLACE(@FieldShow,@Field,N"a."+@Field) SELECT @Where=REPLACE(@Where,@s,N"a."+@s), @FieldOrder=REPLACE(@FieldOrder,@s,N"a."+@s), @FieldShow=REPLACE(@FieldShow,@s,N"a."+@s), @Where1=STUFF(@Where1+N" AND a."+@s+N"=b."+@s,1,5,N""), @Where2=CASE WHEN @Where="" THEN N"WHERE (" ELSE @Where+N" AND (" END+N"b."+@s+N" IS NULL"+@Where2+N")" --执行查询 EXEC(N"SELECT TOP "+@TopN +N" "+@FieldShow +N" FROM "+@tbname +N" a LEFT JOIN(SELECT TOP "+@TopN1 +N" "+@FieldKey +N" FROM "+@tbname +N" a "+@Where +N" "+@FieldOrder +N")b ON "+@Where1 +N" "+@Where2 +N" "+@FieldOrder) END GO
优点:稳定,性能不错;
缺点:对主键设置要求很高。
技巧:如果出现查询结果没有,需要检察主键设置,或者干脆重新创建一个表。
联高软件
联高软件
>
技术文章
>
Web数据库开发
·程序员必须知道的SQLSERVER数据库优化技巧 (14860)
·在Windows xp系统上安装了SQL server服务器版 (2798)
·SQL优化(索引、存储过程、数据分页的存储过程) (3688)
·ASP与存储过程 (1878)
·数据库中存储过程的自动化生成 (2393)
·在ASP.Net中两种利用CSS实现多界面的方法 (914)
·介绍两种调试程序的方法 (2999)
·C++Builder下实现对端口读写的两种方法 (2467)
最新文章
·一个代码搞定页面压缩HTTPC
·C#开发WAP之GOOGLEADSENSE移
·EXCEL合并文件及合并工作表
·C#代码注释文字自动提取,与
·两种通用分页存储过程的对比
·用C#写ASP.NET搜索蜘蛛代码
·C#编写GOOGLESITEMAP.XML源
·静态HTML代码优化的基本SEO
·几项SEO原则打造良好的网页
·如何使用SQLSERVER2000中的
·超强C#图片上传,加水印,自
·C#中用SYSTEM.XML读写XML说
·C#取真实IP地址及分析
·C#+DIRECT3D9.0开发实例之月
·ASP程序员学习C#之超级攻略
·通过C#实现集合类纵览.NETC
·C#开发WAP程序实例
·C#3.0中对象初始化器和集合
·C#3.0新特性速览
·ASP和ASP.NET的MD5加密中文
·CSS截取固定长度字符串
·简单实用的C#分词源代码(含
·C#高效分页代码(不用存储过
·SERVER.TRANSFER是在两个页
·一个克隆对象的C#基类
·C#语言FTP客户端代码
·递归枚举排列、组合的C#源码
·在C#.NET中跟踪代码的运行过
·ASP.NET2.0中实现跨页面提交
·C#通用的数据操作类
·常用的C#数据检查类
·C#中的域(FIELD)和属性(
·C#编码规范和编程好习惯
·C#编码好习惯
·用C#实现C/S模式下软件自动
·C#参考之访问关键字:BASE、
·C#实现遗传算法模拟花朵的进
·用C#的类实现数据结构的堆栈
·在C#中应用哈希表(HASHTABL
·用C#生成中文汉字验证码的基
·C#.NET支付宝接口
·在C#中利用SHARPZIPLIB进行
·程序员必须知道的SQLSERVER
·360度全方位比较C#和VB
·C#设计模式之建造者(BUILDE
·C#抽象工厂模式的几种实现方
·用设计模式固化C#程序
·数据结构与算法(C#实现)系列
·在C#中建立复杂的、灵活的S
·解读C#中的正则表达式
热门文章
·程序员必须知道的SQLSERVER
·OpenGL 入门教程(一)
·C#中用SYSTEM.XML读写XML说
·OpenGL基础篇
·使用回调函数(VC & Delphi)
·OpenGL 入门教程(二)
·C++Builder的一些技巧
·数控加工技术试题库
·矩阵相乘的快速算法
·矩阵求逆的快速算法
·C#中SOCKET多线程编程实例
·数控车床加工编程典型实例分
·如何实现进程间数据通讯技术
·数控试题(一)
·第一个三角形:NeHe的OpenG
·数控考题(二)
·选择与反馈 (OpenGL)
·函数调用的几个概念:_stdc
·用C#实现C/S模式下软件自动
·C#高效分页代码(不用存储过
·SERVER.TRANSFER是在两个页
·TServerSocket和TClientSoc
·OpenGL 入门教程(三)
·OpenGL 入门教程(四)
·Dijkstra 最短路径算法的一
·地理信息系统中的常规网络分
·数控机床标准M代码
·数控车床基本坐标关系及几种
·纹理映射:OPENGL 教程-第六
·OpenGL 入门教程(六)