SQL自定義函數


在SQL中不但可以定義存儲過程,還可以定義函數,觸發器。這里我們簡單講講函數的使用。

如果你對這些語法不熟悉,可以查看sql存儲過程入門系列課程。這里所用到的語法都是那個課程涉及到。

查看連接SQL存儲過程入門系列教程

http://www.cnblogs.com/lideng/archive/2013/04/11/3013966.html

函數我們分為系統函數和自定義函數。

一,系統函數

請參考一下鏈接 http://msdn.microsoft.com/zh-cn/library/ms191238(v=sql.105).aspx

這里還是簡單說下系統函數。

比如在存儲過程(四)中提到了捕獲錯誤的函數

       ERROR_NUMBER() 返回錯誤號。

    ERROR_SEVERITY() 返回嚴重性。

    ERROR_STATE() 返回錯誤狀態號。

    ERROR_PROCEDURE() 返回出現錯誤的存儲過程或觸發器的名稱。

    ERROR_LINE() 返回導致錯誤的例程中的行號。

    ERROR_MESSAGE() 返回錯誤消息的完整文本。該文本可包括任何可替換參數所提供的值,如長度、對象名或時間。

這些函數都是系統函數。

比如我們想查看當前用戶登錄的用戶名

SELECT SUSER_NAME();

這樣便會返回登錄的用戶名了。好了關於系統函數,我們就將這樣多了。

我們主要講講自定義函數,怎么編寫,怎么調用。

 

二,自定義函數

自定義函數分為:標量值函數或表值函數兩種。

  • 標量值函數:如果 RETURNS 子句指定一種標量數據類型,則函數為標量值函數。
  • 表值函數:如果 RETURNS 子句指定 TABLE,則函數為表值函數。

表值函數又分為兩種:內嵌表值函數(行內函數)或多語句函數

  • 如果 RETURNS 子句指定的 TABLE 不附帶列的列表,則該函數為內嵌表值函數。
  • 如果 RETURNS 子句指定的 TABLE 類型帶有列及其數據類型,則該函數是多語句表值函數

如果你不曉得Returns從哪里來,請看創建函數的語法(這里是創建標量值函數的語法):

Create function 函數名(參數)
Returns 返回值數據類型
[with {Encryption | Schemabinding }]
[as]
begin
SQL語句(必須有return 變量或值)
End

這里的with為附加選項:

  • 如果需要對函數體進行加密,可使用WITH ENCRYPTION
  • 果需要將創建的函數與引用的數據庫綁定,可以使用WITH SCHEMABINDING(注:函數一旦綁定,則不能刪除、修改,除非刪除綁定

現在我們就為三種函數分別舉個例子看看。

  1. 首先看一個標量值函數

           

CREATE FUNCTION Foo(@ret int )  --傳入了一個int類型的參數
RETURNS int       --注意這里返回的是一個數據類型
AS  
BEGIN 
    declare @n int
    set @n = 3
    return @n* @ret
END

函數我們創建好了,怎么調用呢,看看下面

select dbo.foo(2)

結果輸出為6,這里需要注意的是:創建函數的時候不需要加dbo.,但在訪問的時候,標量函數要加.dbo的,否則的話會報錯“不是可以識別的 內置函數名稱。”

2.首先看定義一個內嵌表值函數語法:

create function 函數名(參數)
returns table
[with {Encryption | Schemabinding }]
as
return(一條SQL語句)

還是來看個例子比較直觀:

create function GetUser(@name varchar(10))
returns table
as
return select * from userInfo where userName=@name

函數創建好了,怎么調用呢

select * from getuser('admin')

上面的sql將會返回一行數據,如果記錄存在的話,不存在的話當然就不顯示了哈。調用是不是很簡單呢。

3,這里就看第三種,多語句表值函數,查看定義:

 --多句表格值函數
   create function 函數名(參數)
   returns 表格變量名table (表格變量定義)
   [with {Encryption | Schemabinding }]
as
   begin
    SQL語句
   end
--多句表格值函數包含多條SQL語句,至少有一條在表格變量中填上數據值

我們來看個例子:

create function GetInfo(@name varchar(20))
returns @cTable table(UserName varchar(10),UserPwd varchar(10))
as
begin
  insert into @cTable
  select userName,userPass from userinfo where username=@name
return   --函數中最后一條語句必須是返回語句。
end
--調用
select * from GetInfo('admin')
------------
UserName UserPwd
admin     amin

 

對於sql的函數大體都這樣了,這里我們來看個例子。

如果我們想在sql 中寫一個函數,輸入一個參數,返回是1到這個參數的求和值,參數當然是正整數類型的。

於是寫了下面這個函數。

create function sumUp(@number int)
returns int
as 
begin
    declare @sum int,@i int;
    set @sum = 0;
    set @i = 0;
    while @i <= @number
    begin
         set @sum=@sum+@i
         set @i=@i+1
     end
    return @sum
end

從1到10的求和

select dbo.sumUp(10)

------
55

從1到100的求和

select dbo.sumUp(100)

--------
5050

看到函數的方便處了賽。

當然函數還有其他的用法,比如我們動態構造一張表,根據某些業務生產這張表,然后返回來,並與數據庫中的表連接查詢。

如果你對上面的語法不熟悉,比如變量的聲明啊,賦值啊,while的循環啊,可以查看SQL存儲過程入門系列,語法都是一樣的。

http://www.cnblogs.com/lideng/archive/2013/04/11/3013966.html

 

我這里有個SQL題目,當然是網上找的哈,歡迎各位嘗試交流,

Design a product catalogue with products (name, price, description), and n-level and multiple categories and manufacturer (name, logo). Draw normalized table structure with primary & foreign keys and write SQL to retrieve all n-level category products recursively, expected output:

Books – Philosophy – Metaphysics

Books – Philosophy – Confucianism - Mencius

Books – Literature – Lin Yutang

Software – Utilities – File Management


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM