sql server 2005分页存储过程和sql server 2000分页存储过程(转,来源不明)

sql server 2005分页存储过程和sql server 2000分页存储过程,sql 2005的分页存储过程分3个版本,一个是没有优化过的,一个是优化过的,最后一个支持jion的,sql2000的分页存储过程,也可以运行在sql2005上,但是性能没有sql2005的版本好。

ContractedBlock.gif ExpandedBlockStart.gif Code
 1USE [svnhost]
 2GO
 3ExpandedBlockStart.gifContractedBlock.gif/**//****** 对象:  StoredProcedure [dbo].[up_Page2005]    脚本日期: 05/21/2008 11:27:05 ******/
 4SET ANSI_NULLS ON
 5GO
 6SET QUOTED_IDENTIFIER ON
 7GO
 8CREATE proc [dbo].[up_Page2005] 
 9@TableName varchar(50),        --表名
10@Fields varchar(5000= '*',    --字段名(全部字段为*)
11@OrderField varchar(5000),        --排序字段(必须!支持多字段)
12@sqlWhere varchar(5000= Null,--条件语句(不用加where)
13@pageSize int,                    --每页多少条记录
14@pageIndex int = 1 ,            --指定当前为第几页
15@TotalPage int output            --返回总页数 
16as
17begin
18    Begin Tran --开始事务
19    Declare @sql nvarchar(4000);
20    Declare @totalRecord int;    
21    --计算总记录数
22
23     if (@SqlWhere='' or @sqlWhere=NULL)
24        set @sql = 'select @totalRecord = count(*) from ' + @TableName
25    else
26        set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere
27    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数        
28
29    --计算总页数
30
31    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
32
33    if (@SqlWhere='' or @sqlWhere=NULL)
34        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
35    else
36        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere    
37
38    --处理页数超出范围情况
39    if @PageIndex<=0 
40        Set @pageIndex = 1
41
42    if @pageIndex>@TotalPage
43        Set @pageIndex = @TotalPage
44
45     --处理开始点和结束点
46    Declare @StartRecord int
47    Declare @EndRecord int
48
49    set @StartRecord = (@pageIndex-1)*@PageSize + 1
50    set @EndRecord = @StartRecord + @pageSize - 1
51
52    --继续合成sql语句
53    set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord+ ' and ' +  Convert(varchar(50),@EndRecord)
54     print @sql   
55    Exec(@Sql)
56    ---------------------------------------------------
57    If @@Error <> 0
58      Begin
59        RollBack Tran
60        Return -1
61      End
62     Else
63      Begin
64        Commit Tran
65        Return @totalRecord ---返回记录总数
66       End    
67end
68

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1ExpandedBlockStart.gifContractedBlock.gif/**//****** 对象:  StoredProcedure [dbo].[up_Page2005V2]    脚本日期: 05/21/2008 11:27:15 ******/
 2SET ANSI_NULLS ON
 3GO
 4SET QUOTED_IDENTIFIER ON
 5GO
 6-- =============================================
 7-- Author:        <Author,,Name>
 8-- Create date: <Create Date,,>
 9-- Description:    <Description,,>
10-- =============================================
11CREATE PROCEDURE [dbo].[up_Page2005V2] 
12@TableName varchar(50),        --表名
13@Fields varchar(5000= '*',    --字段名(全部字段为*)
14@OrderField varchar(5000),        --排序字段(必须!支持多字段)
15@sqlWhere varchar(5000= Null,--条件语句(不用加where)
16@pageSize int,                    --每页多少条记录
17@pageIndex int = 1 ,            --指定当前为第几页
18@totalRecord int = 0,
19@TotalPage int output            --返回总页数
20AS
21BEGIN
22
23   Begin Tran --开始事务
24     Declare @sql nvarchar(4000); 
25    if @totalRecord<=0 begin
26        --计算总记录数
27        if (@SqlWhere='' or @sqlWhere=NULL)
28            set @sql = 'select @totalRecord = count(*) from ' + @TableName
29        else
30            set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere
31        EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数       
32    end
33
34    --计算总页数
35    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
36
37    if (@SqlWhere='' or @sqlWhere=NULL)
38        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
39    else
40        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere    
41
42    --处理页数超出范围情况
43    if @PageIndex<=0 
44        Set @pageIndex = 1
45
46    if @pageIndex>@TotalPage
47        Set @pageIndex = @TotalPage
48
49     --处理开始点和结束点
50
51    Declare @StartRecord int
52    Declare @EndRecord int
53
54    set @StartRecord = (@pageIndex-1)*@PageSize + 1
55    set @EndRecord = @StartRecord + @pageSize - 1
56
57    --继续合成sql语句
58    set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord+ ' and ' +  Convert(varchar(50),@EndRecord)
59     print @sql   
60    Exec(@Sql)
61    ---------------------------------------------------
62    If @@Error <> 0
63      Begin
64        RollBack Tran
65        Return -1
66      End
67     Else
68      Begin
69        Commit Tran
70        Return @totalRecord ---返回记录总数
71      End   
72END
73
74GO

 
ContractedBlock.gif ExpandedBlockStart.gif Code
 1 /****** 对象:  StoredProcedure [dbo].[up_Page2005V2_Join]    脚本日期: 05/21/2008 11:27:30 ******/
 2 SET ANSI_NULLS ON
 3 GO
 4 SET QUOTED_IDENTIFIER ON
 5 GO
 6 -- =============================================
 7 -- Author:        <Author,,Name>
 8 -- Create date: <Create Date,,>
 9 -- Description:    <Description,,>
10 -- =============================================
11 CREATE PROCEDURE [dbo].[up_Page2005V2_Join]
12 @TableName varchar(150),        --表名
13 @Fields varchar(5000= '*',    --字段名(全部字段为*)
14 @OrderField varchar(5000),        --排序字段(必须!支持多字段)
15 @sqlWhere varchar(5000= Null,--条件语句(不用加where)
16 @pageSize int,                    --每页多少条记录
17 @pageIndex int = 1 ,            --指定当前为第几页
18 @totalRecord int = 0,
19 @TotalPage int output            --返回总页数
20 AS
21 
22 BEGIN
23      Begin Tran --开始事务
24     Declare @sql nvarchar(4000); 
25 
26     if @totalRecord<=0 begin
27 
28         --计算总记录数
29         if (@SqlWhere='' or @sqlWhere=NULL)
30             set @sql = 'select @totalRecord = count(*) from ' + @TableName
31         else
32             set @sql = 'select @totalRecord = count(*) from ' + @TableName + '  where ' + @sqlWhere
33         EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数       
34     end
35 
36     --计算总页数
37     select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
38     if (@SqlWhere='' or @sqlWhere=NULL)
39         set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
40     else
41         set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere    
42 
43     --处理页数超出范围情况
44     if @PageIndex<=0 
45         Set @pageIndex = 1
46 
47     if @pageIndex>@TotalPage
48         Set @pageIndex = @TotalPage
49 
50      --处理开始点和结束点
51     Declare @StartRecord int
52     Declare @EndRecord int
53 
54     set @StartRecord = (@pageIndex-1)*@PageSize + 1
55     set @EndRecord = @StartRecord + @pageSize - 1
56 
57     --继续合成sql语句
58     set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord+ ' and ' +  Convert(varchar(50),@EndRecord)
59      print @sql 
60 
61     Exec(@Sql)
62     ---------------------------------------------------
63     If @@Error <> 0
64       Begin
65         RollBack Tran
66         Return -1
67       End
68      Else
69       Begin
70         Commit Tran
71         Return @totalRecord ---返回记录总数
72       End   
73 END
74 

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 USE [game]
 2 GO
 3 /****** 对象:  StoredProcedure [dbo].[page]    脚本日期: 05/21/2008 11:37:12 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 CREATE proc [dbo].[page]
 9 @RecordCount int output,
10 @ReturnCount bit,
11 @QueryStr nvarchar(1000)='table1',--表名、视图名、查询语句
12 @PageSize int=20,  --每页的大小(行数)
13 @PageCurrent int=2,  --要显示的页 从0开始
14 @FdShow nvarchar (2000)='*'--要显示的字段列表
15 @IdentityStr nvarchar (100)='id'--主键
16 @WhereStr nvarchar (2000)='1=1',
17 @FdOrder nvarchar(100)='desc' --排序    只能取desc或者asc
18 as
19 
20 set nocount on
21 declare
22 @sql nvarchar(2000)
23 
24 if @WhereStr = '' begin
25 
26 set @WhereStr = '1=1'
27 
28 end
29 
30 if @ReturnCount=1 begin
31 declare @tsql nvarchar(200)
32 set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr
33 exec sp_executesql @tsql,N'@RecordCount int output',@RecordCount output
34 end
35 
36 if @PageCurrent = 0 begin
37 set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' ' + @FdOrder
38 end
39 
40 else begin
41 if upper(@FdOrder= 'DESC' begin
42 
43 set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '< ( select min(' + @IdentityStr + ') from (select top ' + cast(@PageSize*@PageCurrent as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' desc) as t) order by ' + @IdentityStr + ' desc'
44 
45 end
46 
47 else begin
48 
49 set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '> ( select max(' + @IdentityStr + ') from (select top ' + cast(@PageSize*@PageCurrent as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' asc) as t) order by ' + @IdentityStr + ' asc'
50 
51 end
52 
53 end
54 
55 --print @sql
56 
57 execute(@sql)
58 
59 --select @t = datediff(ms,@t1,getdate())---------------------
60 

 

 
 

转载于:https://www.cnblogs.com/Denic/archive/2008/10/10/1308309.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是代理服务器 随着计算机知识的逐步普及以及INTERNET网络的迅速发展,学习网络和使用网 络不再是那些有钱和有技术的人的专利,INTERNET网络已作为一种生活方式走 进了寻常百姓家。越来越多的公司也纷纷将自己的公司局域网接入了INTERNET 。当然接入因特网的方式是多样的。通常,对于个人用户来说,只要购买一个调制解调 器通过一根电话线就能连上因特网了。公司由于计算机数量多,通信需求量大,一般都 采用专线接入方式。然而专线费用太昂贵了,那么有没有办法利用一条电话线就可以使 多台计算机同时上网呢?   在这种情况下,代理服务器便应运而生了。那什么是代理服务器,它是如何工作的 ,它有什么作用以及如何设置和使用代理服务器就成了人们很关心的话题。籍于此,笔 者就把自己知道的有关代理服务器的知识写下来,希望能给那些想迫切了解这方面知识 的用户或网友带去一点点帮助!      代理服务器的基本概念   代理服务器(Proxy Server)就是个人网络和因特网服务商之间的中间代理机构,它 负责发合法的网络信息,并对发进行控制和登记。   在使用网络浏览器浏览网络信息的时候,如果使用代理服务器,浏览器就不是直接 到Web服务器去取回网页,而是向代理服务器发出请求,由代理服务器取回浏览器所需要 的信息。   目前使用的因特网是一个典型的客户机/服务器结构,当用户的本地机与因特网连 接时,通过本地机的客户程序比如浏览器或者软件下载工具发出请求,远端的服务器在 接到请求之后响应请求并提供相应的服务。   那么代理服务器起什么作用呢? 代理服务器处在客户机和服务器之间,对于远程服务器而言,代理服务器是客户机,它 向服务器提出各种服务申请;对于客户机而言,代理服务器则是服务器,它接受客户机 提出的申请并提供相应的服务。也就是说,客户机访问因特网时所发出的请求不再直接 发送到远程服务器,而是被送到了代理服务器上,代理服务器再向远程的服务器提出相 应的申请,接收远程服务器提供的数据并保存在自己的硬盘上,然后用这些数据对客户 机提供相应的服务。 ----------------------- 什么是代理服务器全文共1页,当前为第1页。
大学校园服务器的部署方案 目 录 用户需要分析 服务器所处环境的建设原则 服务器局域网技术选择 服务器所在网络总体结构 网络设备选型和数量 网络设备报价 网络安全 网络管理 网络应用描述 内容摘要 1. 用户需要分析 对比写字楼和小区,大学校园的网络有其独特的需要。 即要满足老师办公、教学的需要,也要满足学生上网学习娱乐的需要,同时还要考 虑学校的监控需要。 项目背景  随着信息化程度的提高,越来越多的学(院)校建了校园网和网站,把校园的介 绍、规划、招生、研究成果等发布在网站,让更多的人了解自己的校园,甚至在网上即 时进行学术交流等。在网络信息技术高度发展的今天,xxx大学作为一个高等院校,为了 方便学术交流、校友联络、招生报名、研究成果的发布等,建设自己的网站和邮件 系统是必须的。在当前的信息互动交流中,电子邮件的应用凭借其快速、灵活的特点, 在整个互联网络应用中有着举足轻重的地位。xxx大学提供给师生优质的电 子邮件服务,不仅仅可以更好地利用现有网络资源为广大师生服务,还可以充分向海内 外树立和宣传xxx大学的品牌形象,同时也方便了校友与母校的联络。   信息化程度的提高,极大地促进了教育事业的发展,但是随之而来的却是信息安全 问题。xxx大学校园网以广域网络作为支撑平台,如何保障网络安全成为不可避免的重大 问题。在xxx大学校园网中,无论是有意的攻击,还是无意的误操作,都将会给信息系统 带来不可估量的损失。攻击者可以窃听网络上的信 息、窃取用户的口令和数据库的信息;还可以篡改数据库内容、伪造用户身份、否认自 己的签名;更有甚者,攻击者可以删除数据库内容、摧毁网络节点、释放计算 机病毒等等。内部工作人员能较多地接触内部信息,工作中的任何不小心都可能给信息 安全带来危险。这些都使信息安全问题越来越复杂。   面对计算机网络中的种种安全威胁,必须采取有力的措施来保证安全。无论是在局 域网还是在广域网中,网络的安全措施应是能全方位地杜绝各种不同 的威胁和脆弱性,这样才能确保网络信息的保密性、完整性和可用性。在xxx大学校园网 中,应防患于未然,一旦出了事,亡羊补牢,恐怕为时已晚。根据网络安 全监测软件的实际测试情况显示,一个没有安全防护措施的大型网络,其安全漏洞可达 1500个左右。目前的网络中虽然采用一些安全产品,有一套安全制度,但 由于各种客观和主观的原因仍然存在种种安全上的问题。同时,由于网络的安全状况随 着时间变化而变化,因此在作全网安全考虑时,除了合理的使用和配置各种安 全软件、硬件产品以外,日常的检测和后续的服务也越来越受到重视。 2、网络简况 在xxx大学的网络系统中,网络设备产品类型包括路由器、防火墙、核心交换机、工 作组交换机、以太网卡等,服务器平台主要为Windows Server2003,工作站系统平台有:Win7 /XP/2000 Professional等,主要的服务器为:SMTP邮件服务器、SQL数据库服务器、FTP文件传输 服务器、OA办公自动化服务器、网站服务器、图书馆资料管理服务器等等。   根据xxx大学本部服务器部署拓扑图,本部网络的服务器分成两个部分,一部分是对 外提供服务的WEB服务器群、DNS服务器和邮件服务器,另一部分是对内提供服务的教学 服务器、数据库服务器、代理服务器等。对外提供服务的服务器接到了到CNCNet的防火 墙的非军事化区,而对内提供服务的服务器直接接到了主干交换机上。   xxx大学校园网的财务专网,是通过网通提供的虚拟专网连接起来的一个单独的广域 网络,它通过财务信息发布服务器与整个校园网建立联系。   3、系统分析   xxx大学校园网络在规划时,已考虑到了安全方面的问题,也采取了一些措施来保障 网络的安全,如使用防火墙、MPLS虚拟专用网等等。但是,这些安全措施是不完备的。   (1) 校园网只考虑了对外服务器的安全性,对内服务器则是暴露在内部交换机上,随时可能 受到来自内部用户的扫描、窥探和攻击;   (2) 整个网络没有采取防病毒措施,如果病毒扩散,将会迅速蔓延到整个网络,后果不堪设 想;   (3) 在目前只有CNCNet出口的情况下,所有的服务器都接到一台防火墙的DMZ上,从系统效率 来看,这样是不合适的,如果将来接到了CerNet上,可以考虑将一部分业务如邮件移到 CerNet出口处的防火墙的DMZ区上。   根据安全评估和检测的结果,发现有以下问题:   (4) 首先,整个网络的结构复杂,服务器繁多,网络管理员没有合适的工具及时对整个网络 的安全状况及时做出评估,无法防患于未然;   (5) 其次,我们在对各服务器进行扫描的时候发现,有些服务器打开了多余的服务,攻击者 可以通过它们威胁服务器的安全;   (6) 最后,有些服务程序本身存在漏洞,这些

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值