SQL自定義函數function


用戶定義自定義函數像內置函數一樣返回標量值,也可以將結果集用表格變量返回。
sql函數必須有返回值。

ps:
函數看成一個處理某些數據的功能,因有返回值,則在代碼使用中,需要一個處理過的數據。
可直接調用函數處理數據,返回數據給代碼使用。

標量函數:返回一個標量值。
表格值函數{內聯表格值函數、多表格值函數}:返回行集(即返回多個值)

標量函數和表格值函數的區別在於 返回是標量值(單個數字或者單個數據),還是表格值(多個數據)

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

Schemabinding :將函數綁定到它引用的對象上(注:函數一旦綁定,則不能刪除、修改,除非刪除綁定)

例子:

create funetion SumRes(@sco nvarchar(20))
returns real //返回值類型
as
begin

declare @sum real //變量
declare @code varchar(11) //變量

set @code = @sco + '%' //賦值
select @sum = sum(result) from LearnResult where scode like @code //查詢結果賦值

return @sum 
end

引用自定義函數

select 用戶名.函數名 as 字段別名
select dbo.AvgResult('sooo2') as result 

用戶自定義函數返回值可放在局部變量中,用set select exec 賦值

declare @sum1 real,@sum2 real,@sum3 real
set @sum1 = dbo.SumRes('sooo2')
select @sum2 = dbo.SumRes('sooo2')
exec @sum3 = dbo.SumRes'sooo2'
select @sum1,@sum2.@sum3

2、表格值函數
a、內聯表格值函數
格式:
create function 函數名(參數)
returns table
[with{ Encryption | Schemabinding }]
as
return(一條SQL語句)

例子:

create function tabcmess(@code nvarchar(50))
returns table
as
return(select id name from tableName)

b、多句表格值函數

多表格值函數的定義:包含多條SQL語句,必須或者至少有一條給表格變量賦值!!!

表格變量格式:
returns @變量名(dt) table( 列定義 | 約束定義 )

對表格變量中可以執行 select, insert, update, delete,
但select into 和 insert 語句的結果集是從存儲過程插入。

格式:
create function 函數名(參數)
return @dt table(列的定義)
[with{Encryption | Schemabinding}]
as
begin
SQL語句
end

例子:

create function tabcmess(@code nvarchar(50))
returns @dt table(id @nvarchar(20),name @nvarchar(50))
as

begin
//添加表格變量數據
insert into @dt select id name from tablename where name like @code

return

end

表格值函數的引用
select * from tabcmess(‘qoooo3’)

演示SQL函數編程簡單的使用例子:
創建表:

create Table DepCompany
(
ID int,
panytemID nvarchar(20), --公司等級
panyartmentID nvarchar(20), --部門級別
panyName nvarchar(50), --部門名稱
panyTurnover bigint --部門營業額
)

/*
公司分為總公司(代號1) -> 分公司(代號2) -> 支公司(代號3)
部門等級 -> 按照公司等級"牽引"部門所屬是哪個等級的公司(例如:"支公司3"旗下有 "龍湖部門3","金平部門3","達豪部門3")
*/

insert into DepCompany(ID,panytemID,panyartmentID,panyName,panyTurnover) 
values (1,'1','1','部門一部',10000000),
(2,'1','1','部門二部',10000000),
(3,'1','1','部門三部',100000),
(4,'1','1','部門四部',10000000),
(5,'1','1','部門五部',100000),
(6,'1','1','部門六部',100000),
(7,'2','2','部門一部',10000000),
(8,'2','2','部門二部',100000),
(9,'2','2','部門三部',10000000),
(10,'1','1','部門七部',100000),
(11,'1','1','部門八部',100000),
(12,'1','1','部門九部',100000),
(13,'3','3','部門一部',10000000),
(14,'3','3','部門二部',100000),
(15,'3','3','部門三部',100000),
(16,'3','3','部門四部',10000000),
(17,'2','2','部門四部',100000),
(18,'2','2','部門五部',10000000),
(19,'2','2','部門六部',100000),
(20,'1','1','部門十部',10000000),
(21,'2','2','部門七部',100000)

創建函數

create function Company2(@ID nvarchar(10))
returns @dt table(ID int, PanytemID nvarchar(10),PanyartmentID nvarchar(10),PanyName nvarchar(50),panyTurnover int)
as
begin

insert into @dt select ID,panytemID,panyartmentID,panyName,panyTurnover from DepCompany where panytemID = @ID

return
end

引用/使用函數

select * from dbo.Company2('2')

---------------------
作者:秋風十里
來源:CSDN
原文:https://blog.csdn.net/qq_23833037/article/details/53170789
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

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



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