设为首页 收藏本站
查看: 950|回复: 0

[经验分享] SQL Server游標應用技巧一例

[复制链接]

尚未签到

发表于 2015-6-30 16:30:41 | 显示全部楼层 |阅读模式
  
        問題的發生有時候是偶然的,也許你從來沒有關注,但並不代表你以後不會遇到同樣(類似)的問題。有關SQL中游標的示例很多,這裡我也結合實例來講解SQL的應用技巧,文中主要是利用游標的實現對多個記錄的添加。

        問題的提出:



DSC0000.gif 如下三個有關安排課程的表:


   课程表是一开学就维护好的,不用改变。调课表是记录中途课程变动的。实时课表是根据上述两表自动生成的。

需進行如下操作來設置課程:
   在选择好学年(XueN), 学期(XueQ),班级(BanJ), 周次(ZhouC)后,先从临时课表中读数据,如为空,则把课程表数据插入实时课表中,并加上周次(ZhouC);若不为空,则把对应星期(XingQ),节次(JieC)的那门课换成临时调课后的实际课程(ShiJKCh),然后再备注(BeiZh)里面加上调课原因(TiaoKYY)
   需要输入的XueN,XueQ,BanJ,ZhouC。


        問題的解決方法如下,文中有詳細注解,此處不再詳述。


create procedure foo
@XueN int,    --外部輸入
@XueQ int,
@banj int,
@Zhouc int
as
declare @JieC int,        --內部變量
    @XingQ int,
    @KeCh char(200)
begin
  --先嚐試從調課表中搜索資料並對實時課表進行更新操作
    update T_SSKB set kech=TK.shijkch,BeiZh=TK.TiaoKYY from T_SSKB KB,T_TK TK where  
    TK.XueN=@XueN and TK.XueQ=@XueQ and TK.banj=@Banj and TK.ZhouC=@ZhouC  
    and KB.XueN=TK.XueN and KB.XUEQ=TK.XueQ and KB.banJ=TK.banJ and KB.ZhouC=TK.zhouC
    and KB.XingQ=T_SSKB.XingQ and KB.JieC=T_SSKB.JieC

  --如果返回結果為0,說明調課表中沒有相關記錄,這時就從課程表中搜尋相關記錄進行插入操作
    if @@RowCount=0  
   begin
    DECLARE my_cursor CURSOR FOR    --定義一個游標,用於循環處理

    select XingQ,JieC,KeCh from T_KCB where  
        XueN=@XueN and XueQ=@XueQ and banj=@Banj and ZhouC=@ZhouC  
     
    OPEN my_cursor            --打開游標

    FETCH NEXT FROM my_cursor    --將查尋結果存放在變量中以便處理
    INTO @XingQ, @JieC,@KeCH


    WHILE @@FETCH_STATUS = 0    --Fetch語句順利執行時循環處理
    BEGIN
        --執行插入操作
        Insert Into T_SSKB ( XueN,xueQ,BanJ,ZhouC,xingQ,JieC,KeCh) values
            (@XueN,@XueQ,@Banj,@ZhouC,@XingQ,@jieC,@KeCH)
        if @@error0
        begin
            raiserror('error',16,1)        --異常處理
            rollback transaction
        end
        FETCH NEXT FROM my_cursor    --繼續處理下一條記錄
        INTO @XingQ, @JieC,@KeCH
    end
    CLOSE my_cursor                --關閉遊標
    DEALLOCATE my_cursor            --釋放遊標
    end
end

        以上示例的插入过程其实可以用Insert into语句来代替,更显得简洁高效,之所以我用游标,是随手拿过来举了个游标应用的例子而已,既然有人提出疑问,那我就再把另外一种解法写出来吧。(2005.1.31)


create procedure foo  
@XueN int,    --外部輸入  
@XueQ int,  
@banj int,  
@Zhouc int  
as  
declare @JieC int,        --內部變量  
    @XingQ int,  
    @KeCh char(200)  
begin  
  --先嚐試從調課表中搜索資料並對實時課表進行更新操作  
    update T_SSKB set kech=TK.shijkch,BeiZh=TK.TiaoKYY from T_SSKB KB,T_TK TK where   
    TK.XueN=@XueN and TK.XueQ=@XueQ and TK.banj=@Banj and TK.ZhouC=@ZhouC   
    and KB.XueN=TK.XueN and KB.XUEQ=TK.XueQ and KB.banJ=TK.banJ and KB.ZhouC=TK.zhouC  
    and KB.XingQ=T_SSKB.XingQ and KB.JieC=T_SSKB.JieC  
  
  --如果返回結果為0,說明調課表中沒有相關記錄,這時就從課程表中搜尋相關記錄進行插入操作  
   if @@RowCount=0   
   begin  

    --// 这里是直接用insert into 的方法
    insert into T_SSKB select XueN, XueQ, BanJ, @ZhouC, XingQ, JieC, KeCh,Space(1) from T_KCB
        where XueN=@XueN and XueQ=@XueQ and banj=@Banj  
    --//

    if @@error=0
    begin
        raiserror('error',16,1)
        rollback transaction
    end
    end
end
        最后说明:需要注意的是,在使用“Insert into table1 select * from table2”句式做插入查询的时候,如果两个表定义的字段不一样,必须在select中使用显示的字段以满足table1的字段定义来代替“ * ”号。

                轉載請注明出版:cnblogs(Bonny.Wong) 2005.1.27

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82030-1-1.html 上篇帖子: Sql Server 查看所有存储过程或视图的位置及内容 下篇帖子: Microsoft JDBC Driver 4.0 for SQL Server
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表