提高效率还是降低效率,要看相对什么来说。
CURSOR能用,但是最好只是在必需的时候用。

解决方案 »

  1.   

    小弟也抛砖引玉一会吧,大师兄曾经告诉过我,SQL SERVER和ORACLE的一个很大区别就是,在ORACLE的PL/SQL中可以尽量地使用CURSOR,在Oracle中,游標的概念貫穿整個PL/SQL,游標在Oracle中被廣泛應用.就連每一個update語句和delete語句都有一個內置的隱式的游標!
    但是SQL Server的處理方式和Oracle完全不同。
    游標在SQL Server很耗资源尤其是嵌套的游标,所以尽量少用。而且在T-SQL里很多SQL操作只要多转换些思路是可以代替游标的功能的。
      
      

  2.   

    在ORACLE的PL/SQL中可以尽量地使用CURSOR,
    这句话不太对
    虽然在Oracle中,游標的概念貫穿整個PL/SQL,
    但它与SQLSERVER
    的基本处理机制是一样的
    我认认为不管什么数据库在用游标前问一下自己
    用一条SQl
    能不能实现你的功能若能,
    就不要用
      

  3.   

    我想glmcglmc(joe) 有道理,不论怎么样,批处理总比游标循环处理效率高。
    不得已只好用游标
      

  4.   

    那用游标和用表变量(table变量)的使用谁好?用表变量是否也同样耗资源呢?
      

  5.   

    肯定是表变量(table变量)好!!!
      

  6.   

    看看下面的数据:然后我提一个问题,提取005,第一个发生CPBS跳跃的纪录 CPMC   CPBS     RKSJ     VOXPATH     CPZS
    ------------------------------------------------
    南方高科 001 2002-07-25 H:\test.vox 广州白云
    中脉远红 002 2002-07-26 H:\test.vox 保健产品
    深圳科技 003 2002-07-28 H:\HDIAL.VOX NULL
    太原煤矿 004 2002-07-28 H:\ARIES.VOX NULL
    南京熊猫 005 2002-08-04 H:\ARIES.VOX NULL
    北京音像 123 2002-09-18 H:\D100.Vox  注释#%^#我想了一下,似乎不用游标还真的不好写:)以下是我的代码:
    ----------------------------------------------------- 利用游标写的选取算法(ok),此处必须考虑空表情况
    declare @index int, @cpbs int
    declare cpbs_cursor scroll cursor for select cpbs from cpjlb --order by cpbs
    open cpbs_cursor
    set @index=@@cursor_rows
    set @cpbs=0
    fetch last from cpbs_cursor into @cpbs
    while @index>0 and @@fetch_status = 0
    begin
    if @index<@cpbs
    begin
    set @index=@index-1
    fetch prior from cpbs_cursor into @cpbs
    end
    else if @index=@cpbs break
    end 
    close cpbs_cursor
    deallocate cpbs_cursorgo大家也可以分析一下算法的好坏,然后我有一个问题,不知道在SQLServer中有没有便捷的解决方式,因为CPBS是char(3),但是我的方法出来的是int,这个int可以是1,2,或者3位,当1,2位时如何格式化成char(3),即左边添加0?
      

  7.   

    CPMC   CPBS     RKSJ     VOXPATH     CPZS
    ------------------------------------------------
    南方高科 001 2002-07-25 H:\test.vox 广州白云
    中脉远红 002 2002-07-26 H:\test.vox 保健产品
    深圳科技 003 2002-07-28 H:\HDIAL.VOX NULL
    太原煤矿 004 2002-07-28 H:\ARIES.VOX NULL
    南京熊猫 005 2002-08-04 H:\ARIES.VOX NULL太原煤矿 011 2002-07-28 H:\ARIES.VOX NULL
    南京熊猫 012 2002-08-04 H:\ARIES.VOX NULL
    北京音像 013 2002-09-18 H:\D100.Vox  注释#%^#北京音像 123 2002-09-18 H:\D100.Vox  注释#%^#
    看上面的数,按照你的意思应该选出011,按照你的算法选出013
      

  8.   

    不会的呀,我已经对这种跳行的作过测试了阿!
    ----------------------------------------------
    我觉得我的算法还是很严谨的,只是我也有一个问题,就是我想格式化输出字符串,现在有一个整数N,不知道有几位,我需要格式化输出00000N,宽度给定w,也就是C语言中的sprintf(%03d,N)一样的功能,有没有朋友指点一下!
      

  9.   

    jiangzhiquan(小将) 朋友我给你分析算法走向第一次选出最后一行,此时index=9 <> cpbs=123 继续选择上一行;
    第二次向上一行,    此时index=8 <> cpbs=013 ..............;
    第三次........,    此时index=7 <> cpbs=012 ..............;
    第四次........,    此时index=6 <> cpbs=011 ..............;
    第四次........,    此时index=5 =  cpbs=005 满足第一次跳跃,break。