zoukankan      html  css  js  c++  java
  • sql server中函數的寫法格式規格

     

    /*****************************************************

    *** author:Susan

    ***date:2005/08/05

    *** expliation:如何寫函數的格式及例子,有游標的用法!

    *** 本版是SQL SERVER 版!

    ******************************************************/

    在sql函數的格式規格:

    CREATE FUNCTION XXX(參數1,參數2,……)

    ※RETURNS 返回值的類型

    /*

    列舉傳入參數

    1:名稱,2:類型,包括長度

    Eg:@strUNIT_CODE varCHAR(3)

    返回值的類型 à類型,包括長度

    Eg: varCHAR(8000)

    */

    As

    /*

    定義內部參數

    1:名稱,2:類型,包括長度

    Eg:@strUNIT_CODE varCHAR(3)

    */

    ※ BEGIN

    Declare

    參數1,

    參數2……………

    /*

    初始化內部參數

    Eg:SET @strUNIT_CODE=’’

    */

    Set參數1的初始值

    Set參數2的初始值…………

    /*

    過程的主內容區

    Trascation:這裡起到的作用是,如果他中間的任何一個執行錯誤,就全部執行都返回,這裡sql sever 7.0以前一定要寫入,以後的就可以省略

    Return:結束這支fn

    */

        /*

            1:可以取得需要的值以存在內部參數中

         Eg:SELECT @strUNIT_CODE=UNIT_CODE FROM UNIT WHERE …….

    2:可以用取到的或傳入的參數進行判斷,來進行各種選取的操作,但不可以進行update,insert,delete等等的操作!

    eg: IF @strUNIT_CODE=’’

             BEGIN

         //具體的操作

    End

    Else

    Begin

        //具體的操作

    End

     3:有關游標的問題

         Eg:

            declare db cursor for       //聲明一個游標(db為其名稱)

            SELECT UNIT_NAME FROM UNIT WHERE LEFT(UNIT_CODE,2)=LEFT(@strTO,2)//記錄集

            open db                 //打開游標

                fetch next from db into @strUNIT_NAME //將第一個值放入一個參數中

            while @@fetch_status = 0 ---存在本筆值向下循環(0:順利執行;-1:失敗,或資料列超出結果集;-2:擷取的資料列已遺漏)

            BEGIN             ----開始循環

                            //個體操作

            End                ----結束循環

            Close db            ---關閉游標

    deallocate db         //移除資料指標參考

    */

    ※ Return 回傳值

    ※ End

    下面是一個例子

    CREATE   FUNCTION TEST_3_Fn(@strTO VARCHAR(4))

    /*

    作者:Susan

    時間:2005/8/2

    程式功能:

    參數: 機關代碼

    輸出:機關名稱

    調用方法:SELECT TEST_3_Fn('011')

    結果:機關名稱串起來

    */

    RETURNS VARCHAR(8000)

    as

     

    BEGIN

     

    DECLARE

     @strUNIT_NAME VARCHAR(800),

     @strSQL VARCHAR(8000),

     @Link VARCHAR(1),

     @Link1 VARCHAR(1)

    SET @strUNIT_NAME=''

    SET @strSQL=''

    SET @Link=''

    SET @Link1=''

     

    /*

    處理update 的部分

    在函數中不可以進行insert,update ,delete的動作!

    功能說明:本fn用於處理cursor問題

    */

        

            IF   @strTO<>''

                     BEGIN

                    declare db cursor for               --必需聲明在查詢的前面

                     SELECT UNIT_NAME FROM UNIT WHERE LEFT(UNIT_CODE,2)=LEFT(@strTO,2)---取到相關信息

                     END

            ELSE

                   BEGIN

                    declare db cursor for                --必需聲明在查詢的前面

                     SELECT UNIT_NAME FROM UNIT WHERE LEFT(UNIT_CODE,2)=LEFT('011',2)---取到相關信息

                     END

            open db                  ---開起取到的信息

            fetch next from db into @strUNIT_NAME          ---把第一筆放入@strUNIT_NAME中

            while @@fetch_status = 0             ---表示存在本筆資料

            BEGIN                               ----開始循環

                    set @strSQL =@strSQL+@Link1+@Link+ @strUNIT_NAME ----設定保存的值

                    fetch next from db into @strUNIT_NAME      ----進行下次循環

                    SET @Link=CHAR(13) +CHAR(10)

                    SET @Link1=','

            END                                 ----結束循環

            close db                           ---關閉信息

            deallocate db   

     

            RETURN @strSQL

    END

  • 相关阅读:
    lambda表达式
    PAT 1071. Speech Patterns
    PAT 1070. Mooncake
    1069. The Black Hole of Numbers
    PAT 1068. Find More Coins
    背包问题(动态规划)
    PAT 1067. Sort with Swap(0,*)
    PAT 1066. Root of AVL Tree
    PAT 1065. A+B and C
    PAT 1064. Complete Binary Search Tree
  • 原文地址:https://www.cnblogs.com/freeliver54/p/372661.html
Copyright © 2011-2022 走看看