SQL Server遊標應用技巧一例

來源:互聯網
上載者:User

        

        問題的發生有時候是偶然的,也許你從來沒有關注,但並不代表你以後不會遇到同樣(類似)的問題。有關SQL中遊標的樣本很多,這裡我也結合實例來講解SQL的應用技巧,文中主要是利用遊標的實現對多個記錄的添加。

        問題的提出:

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

<!--

課程表: T_KCB

  XueN, XueQ, BanJ, XingQ, JieC,KeCh

調課表: T_TK

  XueN, XueQ, BanJ, ZhouC, XingQ, JieC,YuanKCh, ShiJKCh, TiaoKYY

即時課表: T_SSKB

  XueN, XueQ, BanJ, ZhouC, XingQ, JieC,KeCh, BeiZh

-->


   課程表是一開學就維護好的,不用改變。調課表是記錄中途課程變動的。即時課表是根據上述兩表自動產生的。


需進行如下操作來設置課程:

   在選擇好學年(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 @@error<>0

        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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.