SQL 中用户定义函数的使用方法

--用户定义函数的分类:

/*
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('小米平板')

结果:

原文地址:https://www.cnblogs.com/feiquan/p/8679964.html