13、SQL Server 自定義函數


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多語句已經執行完畢。不寫會返回不了。


免責聲明!

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



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