–用户定义函数的分类:
/*
1.标量函数
2.表值函数
2.1内联表值函数 返回单个SELECT语句, 它没有相关的返回变量和函数体
2.2多语句表值函数 是视图和存储过程的结合 可嵌套
*/
标量函数
--标量函数 IF EXISTS(SELECT * FROM sysobjects WHERE name='fun_SeeEverySortAmount') DROP FUNCTION fun_SeeEverySortAmount GO CREATE FUNCTION fun_SeeEverySortAmount(@class varchar(20)) RETURNS INT AS BEGIN DECLARE @Amount int SELECT @Amount=Amount FROM CommoditySort C INNER JOIN CommodityInfo I ON C.SortId=I.SortId WHERE I.CommodityName=@class RETURN @Amount END GO
执行:
--执行 DECLARE @Amount int EXEC @Amount= fun_SeeEverySortAmount '苹果iPhone6' PRINT '苹果iPhone6的库存量为:'+CONVERT(varchar(20),@Amount)
结果:
内联表值函数
--内联表值函数 返回单个SELECT语句, 它没有相关的返回变量和函数体 IF EXISTS (SELECT * FROM sysobjects WHERE name='fun_inlineSeeEverySortAmount') DROP FUNCTION fun_inlineSeeEverySortAmount GO CREATE FUNCTION fun_inlineSeeEverySortAmount(@class varchar(20)) RETURNS table AS RETURN ( SELECT Amount FROM CommodityInfo I WHERE I.CommodityName=@class ) GO
执行:
--执行 调用内联函数和视图的使用一样 SELECT Amount 数量 FROM fun_inlineSeeEverySortAmount('苹果iPhone6')
结果:
多语句表值函数
--多语句表值函数 是视图和存储过程的结合 可嵌套 --如果一件商品的销售数量超过3000则为销量品,1000-3000为一般商品,0-1000 为需要促销 IF EXISTS (SELECT * FROM sysobjects WHERE name='fun_MutilateStatementSalesSort') DROP FUNCTION fun_MutilateStatementSalesSort GO CREATE FUNCTION fun_MutilateStatementSalesSort(@class varchar(20)) RETURNS @salessort table( 商品名 varchar(20), 单价 money, 商品类型 varchar(20), 销售量 int, 商品销售类型 varchar(20) ) AS BEGIN INSERT INTO @salessort SELECT I.CommodityName,I.InPrice,S.SortName,SUM(O.Amount),CASE WHEN SUM(O.Amount)>3000 THEN '销量品' WHEN SUM(O.Amount) BETWEEN 1000 AND 3000 THEN '一般商品' WHEN SUM(O.Amount) BETWEEN 0 AND 1000 THEN '需要促销' END FROM CommodityInfo I INNER JOIN CommoditySort S ON I.SortId=S.SortId INNER JOIN OrderInfo O ON O.CommodityId =I.CommodityId WHERE I.CommodityName=@class GROUP BY I.CommodityName,I.InPrice,S.SortName RETURN END GO
执行:
--执行 它相当于一个表 SELECT* FROM fun_MutilateStatementSalesSort('苹果MD760') SELECT* FROM fun_MutilateStatementSalesSort('尼康D3300') SELECT* FROM fun_MutilateStatementSalesSort('小米平板')
结果: