在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(注:函數一旦綁定,則不能刪除、修改,除非刪除綁定)
現在我們就為三種函數分別舉個例子看看。
- 首先看一個標量值函數
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