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

結果:

 


免責聲明!

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



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