SqlServer 使用者自訂函數

來源:互聯網
上載者:User

標籤:style   color   使用   io   strong   ar   資料   cti   代碼   

      在SQL Server中,使用者不僅可以使用標準的內建函數,也可以使用自己定義的函數來實現一些特殊的功能。可以使用CREATE  FUNCTION 語句建立。在建立時需要注意:函數名在資料庫中必須唯一,其可以有參數,也可以沒有參數,其參數只能是輸入參數,最多可以有1024參數。

      使用者自訂函數不能用於執行一系列改變資料庫狀態的操作,但它可以像系統函數一樣在查詢或預存程序等的程式段中使用,也可以像預存程序一樣通過EXECUTE 命令來執行。

   自訂函數分為  純量涵式、 資料表值函式、 多語句資料表值函式 三種。

  (1)純量涵式:對單一值操作,返回單一值。只要在能夠使用運算式的地方,就可以使用純量涵式。

      (2)資料表值函式:傳回值是一個記錄集合——表。在此函數中,return語句包含一條單獨的select語句。      

  (3)多語句資料表值函式:傳回值是由選擇的結果構成的記錄集。

 

一:純量涵式

  格式如下:

      CREATE FUNCTION [ owner_name.] function_name

          ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

            RETURNS scalar_return_data_type

            [ AS ]

                  BEGIN

                       function_body

                       RETURN scalar_expression

                  END

 

  解釋如下:

  (1)function_name:指使用者自訂函數的名稱。其名稱必須符合標識符的命名規則,並且對其所有者來說,該名稱在資料庫中必須唯一。

  (2)@parameter_name:使用者自訂函數的參數。參數只能代替常量;而不能用於代替表名、列名或其它資料庫物件的名稱。函數執行時每個已聲明參數的值必須由使用者指定,除非該參數的預設值已經定義。如果函數的參數有預設值,在調用該函數時必須指定"default"關鍵字才能獲得預設值。

  (3)scalar_parameter_data_type:參數的資料類型。可以是 SQL Server 支援的任何純量資料型別(text、ntext、image 和 timestamp 除外)。

  (4)scalar_return_data_type:是使用者定義函數的傳回值。資料類型與(3)輸入參數的要求相同。不能有text、ntext、image 和 timestamp類型的參數。

  (5)function_body:位於begin和end之間的一系列 Transact-SQL 陳述式,其只用於純量涵式和多語句資料表值函式。

  (6)scalar_expression:使用者自訂函數中傳回值的運算式。

 

  如果你覺得複雜,可以簡化為

      CREATE FUNCTION  function_name(函數名)

      (  @參數1名  參數1資料類型[ = default ],  @參數2名  參數2資料類型[ = default ],......)

        RETURNS  返回資料類型

        [ AS ]

        BEGIN

                 sql語句

                 RETURN scalar_expression(傳回值)

        END

 例:在STUDENT庫中建立一個使用者自訂函數XUEFEN,該函數通過輸入成績來判斷是否取得學分,當成績大於等於50時,返回取得學分,否則,返回未取得學分。其代碼如下:

   CREATE FUNCTION xuefen(@inputxf int)   --(1)  函數名為 xuefen,輸入參數為@inputxf , 參數資料類型為int

  RETURNS  nvarchar(10)      --(2) 函數的傳回值類型為nvarchar(10)

    BEGIN  --(3) 將sql語句放在  BEGIN  和  END 之間,使其作為一個整體。

        declare @retrunstr nvarchar(10)  --(4) 聲明函數傳回值的變數為@retrunstr,資料類型為nvarchar(10);該類型要與 (2)中聲明的保持一致 

        If @inputxf >=50 

           set  @retrunstr=‘取得學分‘

        else

           set  @retrunstr=‘未取得學分‘

           return @retrunstr

   END

 

使用函數的代碼如下:

        SELECT  學號,成績,dbo.xuefen(成績)  --要在使用的時候指明函數的所有者,在本例中,必須加上dbo.

    AS 學分情況  FROM 課程註冊  WHERE 課程號=‘0003‘

        GO

二:資料表值函式:

 

資料表值函式遵循的原則:

   1、RETURNS子句僅包含關鍵字table。不必定義返回變數的格式,因為它由RETURN 子句中的 SELECT 語句的結果集的格式設定。

   2、function_body 不由BEGIN和END分隔。

   3、RETURN子句在括弧中包含單個SELECT語句。SELECT語句的結果集構成函數所返回的表。內嵌資料表值函式中使用的SELECT語句受到與視圖中使用的SELECT語句相同的限制。

例:在STUDENT庫中建立一個內嵌資料表值函式XUESHENG,該函數可以根據輸入的系部代碼返回該系學生的基本資料。其代碼如下:

CREATE   FUNCTION XUESHENG(@inputxbdm nvarchar(4)) RETURNS  table  

 AS

    RETURN

   ( SELECT 學號, 姓名, 入學時間   FROM  學生 WHERE 系部代碼[email protected])

GO

建立好該內嵌資料表值函式後,就可以象使用表或視圖一樣來使用它:

SELECT  * FROM  DBO.XUESHENG(‘01‘)

GO

三、多語句資料表值函式

 

例:在STUDENT庫中建立一個多語句資料表值函式CHENGJI,該函數可以根據輸入的課程名稱返回選修該課程的學生姓名和成績。其代碼如下:

   CREATE  FUNCTION CHENGJI( @inputkc as char(20) )

    RETURNS @chji TABLE    [email protected]為表變數

      (       課程名  char(20),     姓名    char(8),      成績   tinyint    )

   AS

     BEGIN

       INSERT @chji

          SELECT c.課程名,s.姓名 ,k.成績  FROM 學生 as s INNER JOIN 課程註冊 as k  ON s.學號 =k.學號 inner join 課程 as c  on c.課程號=k.課程號  WHERE c.課程名[email protected]

      RETURN  --直接單獨用 RETURN 即可,將表變數的資料返回

    END

 GO

 

在查詢分析器中輸入以下查詢命令:

 SELECT  * FROM  DBO.CHENGJIi(‘大學語文‘)

總結:

 

多語句函數的主體中允許使用以下語句。

  1、指派陳述式。

  2、控制流程語句。

  3、DECLARE 語句,該語句定義函數局部的資料變數和遊標。

  4、SELECT 語句,該語句包含帶有運算式的挑選清單,其中的運算式將值賦予函數的局部變數。

  5、遊標操作,該操作引用在函數中聲明、開啟、關閉和釋放的局部遊標。只允許使用以INTO子句向局部變數賦值的FETCH語句;不允許使用將資料返回到用戶端的FETCH語句。

  6、INSERT、UPDATE和DELETE語句,這些語句修改函數的局部table變數。

  7、EXECUTE語句調用擴充預存程序。

 

SqlServer 使用者自訂函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.