T-SQL-自訂函數

來源:互聯網
上載者:User

使用者自訂函數
自訂函數不能執行一系列改變資料庫狀態的操作,可以像系統函數在查詢或預存程序等的程式中使用,也可以像相信過程一樣能過execute命令來執行。自訂函數中儲存了一個Transact - SQL常式可以返回一定的值。根據函數傳回值形式的不同,將使用者看定義函數分為三種類型:
( 1 ).標量型函數:標量型函數返回一個確定類型的標量值,其傳回值類型為除了text, ntext , image , cursor ,timestampt和table類型外的其它資料類型。函數體語句定義在begin - end語句內,其中包含了可以傳回值的Transact - SQL命令。
文法:
 create   function   [ owner_name ]  function_name
( [ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] }  [ ,n ] ])
 returns  scalar_return_data_type
 [ with <function_option> [,n ] ]
 [ as ]
 begin
function_body
 return   [ scalar_expression ]
 end
其中:
 < 1 > .function_option有兩個可選值:{encryption | schemabinding}
encryption:加密選項,讓SQL Server對系統資料表中有關create function的聲明加密,以防止使用者自訂函數作為SQL Server複製的一部分被發布。
schemabinding,計劃綁定選項。將使用者自訂函數綁定到它所引用的資料庫物件,則函數所涉及的的資料庫物件從此將不能被刪除或修改,除非函數被刪除或去掉此選項。應注意的是要繫結資料庫對象必須與函數在同一資料庫中。
 < 2 > .owner_name:指定使用者自訂函數的所有者。
 < 3 > .function_name:指定使用者自訂函數的名稱。
 < 4 > .database_name.owner_name.function_name應是唯一的。
 < 5 > . @parameter_name :定義一個式多個參數的名稱,一個函數最多可以定義1024個參數,每個參數前用 @符號標明 ,參數的作用範圍是整個函數,參數只能替代常量,不能替代表名,列名或其它資料庫物件名稱,使用者自訂函數不支援輸出參數。
 < 6 > .scalar_parameter_data_type:指定標量參數的資料類型,除了text, ntext , image , cursor ,timestampt和table類型外的其它資料類型。
 < 7 > .scalar_return_data_type:指定標量傳回值的資料類型,除了text, ntext , image , cursor ,timestampt和table類型外的其它資料類型。
 < 8 > .scalar_expression:指定標量型使用者自訂函數返回的標量值運算式。
 < 9 > .function_body:指定一系列的Transact_SQL語句它們決定了函數的傳回值。

例:建立軍工齡工資計算函數
 use  taihang
 go
 -- 建立函數
 create   function  workyearwage( @hiredate   datetime , @today   datetime , @per_wage   money )
 -- hiredate表示僱傭期,today表示當前日期,par_wage表示每一年的工齡應得的工資額
 returns   money
 as   begin
 declare   @workyearwage   money
 set   @workyearwage = ( year ( @today ) - year ( @hiredate )) * @per_wage
 return ( @workyearwage )
 end -- 結束函數定義
 go
 -- 調用函數
 select  taihang.dbo.workyearwage( ' 1999-7-1 ' , getdate (), 15 )
 as  work_year_wage
注意:以上的函數體可簡寫為:
 as   begin
 return (( year ( @today ) - year ( @hiredate )) * @per_wage )
 end
 
( 2 ).內嵌資料表值函式:以表的形式返回一個傳回值,即它返回的是一個表。內嵌表值型函數沒有由begin - end語句括起來的函數體,其返回的表由一個位於return子句中的select命令段從資料庫中篩先出來。內嵌表值型函數功能相當於一個參數化的視圖。
建立函數文法:
 create   function   [ owner_name ]  function_name
( [ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] }  [ ,n ] ])
 returns   table
 [ with <function_option> [,n ] ]
 [ as ]
 return  ( select - stmt)
其中:
 < 1 > . table :批定傳回值為一個表。
 < 2 > . select - stmt:單個select語句,確定返回的表的資料。
例:建立返回所有訂購某類產品的公司資訊函數
 use  taihang
 go
 create   function  orderfirms( @productid   varchar ( 30 ))
 -- productid表示產品代號
 returns   table
 as
 return ( select   *   from  products p
        where  p.p_id = @productid )
 go
 
( 3 ).多語句表值型函數:可以看作標量型和內嵌表值型函數的結合體,它的傳回值是一個表,但它和標量型函數一樣有一個用begin - end語句括起來的函數體。傳回值表中的資料是由函數體
文法:
 create   function   [ owner_name ]  function_name
( [ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] }  [ ,n ] ])
 returns   @return_variable   table   < table_type_definition >
 [ with <function_option> [,n ] ]
 [ as ]
 begin
function_body
 return   end
其中:
 < 1 > . < table_type_definition > :({column_definition | table_constraint} [ ,n ] )
 < 2 > . @return_variable :一個table類型的變數,用於儲存和累積返回的表中的資料行。

 4 .修改使用者自訂函數
 alter   function :此命令文法與create function相同,相當於重建。
 5 .刪除使用者自訂函數
 drop   function { [ owner_name ] function_name}  [ ,n ]

五、函數
在Transact - SQL語言中,函數被用來執行一些特殊的運算以支援SQL Server的標準命令。
( 1 ).行集合函式:行集合函式可以在transact - SQL語句中當作表引用。
( 2 ).彙總函式:用於一組值執行計算並返回一個單一的值。
( 3 ).純量涵式:用於對傳遞給它的一個或者多個參數值進行處理和計算,並返回一個單一的值.
(一)、純量涵式的分類
 1 .配置函數:返回當前的配置資訊
 2 .遊標函數:返回有關遊標的資訊
 3 .日期和時間函數:用於對日期和時間類型的輸入值進行操作,返回一個了子符串,數字或日期和時間值
 4 .數學函數:用於對作為函數參數提供的輸入值執行操作,返回一個數字值
 5 .中繼資料函數:返回有關資料庫和對象和資訊
 6 .字串函數:對字串輸入值執行操作,並返回一個字中或數字值
 7 .系統函數:執行系統操作
 8 .系統統計函數:返回系統的統計資訊
 9 .文本和映像函數:對於文本或映像輸入值或列執行操作,返回有關這些值的資訊。

具體講解:
 1 .系統函數
用於返回有關SQL Server系統,使用者,資料庫和資料庫物件的資訊。系統函數可以讓使用者在得到資訊後,使用條件陳述式,根據返回的資訊進行不同的操作。與其它函數一樣,可以在select語句的select和where子句經及運算式中使用系統函數。
例:返回taihang資料庫的yuan表中的第二列的名稱。
 use  taihang
 select   col_name ( object_id ( ' yuan ' ), 2 )
註:col_name為系統函數, object_id :返回對象的id。

 2 .日期和時間類型
日期和時間函數用於對日期和時間資料進行各種不同的處理和運算,並返回一個字串,數字值或日期和時間值。
 dateadd ( datepart , number ,date)
 datediff ( datepart ,date1,date2)
 datename ( datepart ,date)
 datepart ( datepart ,date)
 day (date)
 getdate ()
 month (date)
 year (date)
例1:從getdate函數返回的日期中提取月份數
 select   datepart ( month , getdate ())  as   ' month number '
注:datepart為系統函數
例2:從03 / 12 / 1998中返回月份、天數和年份數
 select   month ( ' 03/12/1998 ' ), day ( ' 03/12/1998 ' ), year ( ' 03/12/1998 ' )

 3 .、字串函數
可對位元據、字串和運算式執行不同的運算,大多數字串函數只能用於char和varchar資料類型以及明確轉換成char和varchar的資料類型,少數幾個字串函數也可以用binary和varbinary資料類型。此外,果些字串還可以處理text, ntext ,image資料類型的資料。
 1 .字串函數的分類:
( 1 ).基底字元串函數: upper , lower , space , replicate , stuff , reverse , ltrim , rtrim .
( 2 ).字串尋找函數: charindex , patindex .
( 3 ).長度和分析函數: datalength , substring , right .
( 4 ).轉換函式:asch, char , str , soundex , difference
 
 4 .數學函數
用於對數字運算式進行數學運算並返回運算結果。數學函數可以對SQL Server提供的數字資料( decimal , integer , float , real , money ,samllmoney,smallint和tinyint)進行處理。
例:在一運算式中使用ceiling(向上取整), floor (向下到整), round (四捨五入,N位小數)函數。
 select   ceiling ( 13.4 ), floor ( 13.4 ), round ( 13.4567 , 3 )
結果為14, 13 , 13.4570 。

 5 .轉換函式
一般情況下,SQL Server會自動處理某些資料類型的轉換。例如,如果比較char和datetime運算式、smallint和int運算式、或不同長度的char運算式,SQL Serve可以將它們自動轉換,這種自動轉換稱為隱性轉換。但是無法由SQL Serve自動轉換的或者是SQL Serve自動轉換的結果不符合預期結果的,就需要使用轉換函式做顯示轉換。轉換函式有兩個:convert和cast.
( 1 ). cast (expression  as  data_type)
( 2 ).couvert函數允許使用者反運算式從一鐘資料類型轉換成另一鐘資料類型,還允許反日期轉換成不同的樣式
 convert  (data_type [ length ] ,expression [ ,style ] )
例:
 use  bubs
 select  title,ytd_sales  from  titles
 where   cast (ytd_sales  as   char ( 20 ))  like ' 15% '
      and  type = ' trad_cook '  

聯繫我們

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