在編程過程中,我們通常把特定的功能語句塊封裝稱函數,方便代碼的重用。我們可以在SQL Server中自定義函數,根據函數返回值的區別,我們自定義的函數分兩種:標量值函數和表值函數。
自定義函數的優點:
- 模塊化程序設計
- 更快的執行速度
- 減少網絡傳輸
一個函數最多可以有1024個參數;在調用函數時,如果未定義參數的默認值,則必須提供已聲明參數的值。
創建標量值函數
下面的這個函數根據生日返回年齡:
create function dbo.calcAge(@birthday datetime) --函數名和參數 returns int --返回值類型 as begin declare @now datetime declare @age int set @now=getdate() set @age=YEAR(@now)-YEAR(@birthday) return @age --返回值 end
執行這段腳本創建函數,創建成功之后,我們調用一下看看效果:
print dbo.calcAge('2000-1-1')
輸出:15
注意:在調用自定義函數的時候,我們必須給出schema_name(架構名,此處是dbo),否則會提示“'calcAge' 不是可以識別的 內置函數名稱。”
創建表值函數
顧名思義,表值函數的返回值不再是一個標量值,而是一個數據表;表值函數返回的表與其它數據表一樣,可以進行join、where等操作。
create function getUser(@name nvarchar(50)) returns table as return ( select Id,UserName,[Status] from tb_user where UserName like '%' + @name + '%' )
上面的代碼完成了一個表值函數的創建。
在創建的過程中遇到一點疑問:表值函數不能包含begin…end這樣的語句塊,只能用return返回table?此處存疑。
可以將表值函數放在select語句中使用:
select * from dbo.getUser('admin')
得到的結果集:
修改自定義函數
使用alter語句修改自定義函數,下面的代碼演示如何修改getUser函數:
alter function getUser --指明要修改的函數名 (@status int) --修改參數類型 returns table as return ( select Id,UserName,[Status] from tb_user where [Status]=@status )
刪除自定義函數
使用drop語句刪除:
drop function calcAge