用戶定義自定義函數像內置函數一樣返回標量值,也可以將結果集用表格變量返回。
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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!