SQL Server 自定義函數
在SQL Server中不僅可以使用系統函數(如:聚合函數,字符串函數,時間日期函數等)還可以根據需要自定義函數。
自定義函數分為標量值函數和表值函數。
其中,標量值函數用於返回單個值,而表值函數用於返回一個結果集。
函數參數
參數可以是常量、表中的某個列、表達式或其他類型的值。在函數中有三種類型的參數。
1、輸入:指必須輸入一個值。
2、可選值:在執行該參數時,可以選擇不輸入參數。
3、默認值:函數中默認有值存在,調用時可以不指定該值。
創建標量值函數
語法:
Create function 函數名(參數) Returns 返回值數據類型 [with {Encryption | Schemabinding }] [as] begin SQL語句(必須有return 變量或值) End Schemabinding :將函數綁定到它引用的對象上(注:函數一旦綁定,則不能刪除、修改,除非刪除綁定)
例子:
drop function dbo.input --刪除函數 go create function dbo.input --定義函數 架構.方法名 ( @num1 int, --輸入參數 @num2 int = null, --可選參數 @oper varchar = '+' --默認參數 ) returns int as begin declare @sum int if(@oper='+') begin set @sum = @num1 + @num2 end else begin set @sum = 0 end return @sum end go select dbo.input(1,null,default) --參1必填,參2可選,參3默認 select dbo.input(1,2,default) --輸出3 select dbo.input(1,2,'*') --輸出0 *沒判斷
自定義函數可以將值放在局部變量中,用set select exec賦值
declare @number int select @number = dbo.input(1,2,default) print @number declare @set int set @set = dbo.input(1,2,default) print @set declare @exec int exec @exec = dbo.input 1,2,'+' print @exec
在查詢中引用函數
create table test( id int identity(1,1), name varchar(10), birthDay datetime ) insert into test values('張三','1998-02-01'), ('李四','1981-10-1'), ('王五','1985-5-2') select * from test --測試信息

創建函數並執行后
create function dbo.getAge(@birthDay datetime) returns int as begin declare @age int set @age = datediff(yy,@birthDay,getdate()) return @age end select name as 姓名,dbo.getAge(birthDay) as 年齡 from test

注意:標量值函數不可以返回文本(text、ntext)、圖像、游標或時間戳類型的數據,並且不能用來修改數據庫狀態。
在select語句中使用函數可能會帶來負面影響,因為每返回一行都會調用函數一次。所以在返回大型數據集時應該格外避免使用復雜的函數。
表值函數
表值函數包含兩種類型:內聯函數和多語句函數。
內聯表值函數僅返回一個結果集,而多語句函數可以在函數體中包含一些控制邏輯。
1、內聯表值函數
語法:
create function 函數名(參數) returns table [with {Encryption | Schemabinding }] as
return(一條SQL語句)
例子:
--創建 create function getDetails(@id int) returns table as return(select * from student where id = @id) --執行一條語句后返回 --調用 select * from dbo.getDetails(10)
2、多語句函數
多語句函數可以通過多條語句來創建臨時表,具體需要哪些字段,以及符合哪些要求的數據被添加到臨時表中等。
語法:
create function 函數名(參數) returns 表格變量名 table (表格變量定義) [with {Encryption | Schemabinding }] as begin SQL語句 end
例子:
create function dbo.Test() returns @temp table ( name varchar(20), sex char(2), age int ) as begin insert into @temp (name,sex,age) values ('多語句','嘛',18) insert into @temp (name,sex,age) select name,sex,age from student where age > 18 return end
可以看出,多語句函數返回結果是定義好表結構的虛擬表,最后有一個return用來告訴sql多語句已經執行完畢。不寫會返回不了。
