2017-07-22 37 views
0

我有一個表如果表Else語句值函數

ProdID, ProdName, Price 

我想使用,如果在表else語句值函數,使其因此,如果數量超過或等於10,我想給一個10否則沒有折扣。這是我的代碼。

Create function FDiscount (@ProdName varchar(50), @Qty int) 
Returns Table 
as 
return 
    IF (@Qty >= 10) 
     Select ProdName, Price, @Qty as Qty, Price * @Qty as Total, 
     (Price * @Qty) - (Price * @Qty) /100 * 10 as Discount10 
     from TblProduct 
    Else 
     Select ProdName, Price, @Qty as Qty, Price * @Qty as Total 
     from TblProduct 
Where ProdName = @ProdName 
select * from FDiscount('Milk','10') 

但它說:「關鍵字‘IF’附近有語法錯誤,我似乎無法找到任何解決這個。

回答

0

你可以看到這篇https://stackoverflow.com/questions/440308/tsql-returning-a-table-from-a-function-or-store-procedure

,並使用此

Create function FDiscount (@ProdName varchar(50), @Qty int) 
Returns @retTbl Table(ProdName VARCHAR(100), Price INT, Qty INT, Discount10 INT) 
as 
BEGIN 
DECLARE @tbl TABLE (ProdName VARCHAR(100), Price INT, Qty INT, Discount10 INT) 
    IF @Qty >= 10 
     INSERT INTO @tbl 
     Select ProdName, Price, @Qty , Price * @Qty, 
     (Price * @Qty) - (Price * @Qty) /100 * 10 
     from TblProduct 
    Else 
     INSERT INTO @tbl 
     Select ProdName, Price, @Qty , Price * @Qty , 0 
     from TblProduct 
Where ProdName = @ProdName 
return 
END 
+0

這是節目中說什麼「有返回值的return語句不能在此上下文中使用」。 – Raksa

1

爲什麼不是一個簡單的CASE聲明

CREATE FUNCTION Fdiscount (@ProdName VARCHAR(50), 
          @Qty  INT) 
returns TABLE 
AS 
    RETURN 
     (SELECT prodname, 
       price, 
       @Qty   AS Qty, 
       price * @Qty AS Total, 
       CASE 
       WHEN @Qty >= 10 THEN (price * @Qty) - (price * @Qty)/100 * 10 
       ELSE 0 
       END   AS Discount10 
     FROM tblproduct 
     WHERE prodname = @ProdName) 
+0

但是IF語句有可能嗎? – Raksa

+1

@Raksa - 是的,我們可以..使用多行表值函數,但爲什麼?性能明智內聯將比多線功能更快..不要去爲它 –

+0

這只是我想知道,你能告訴我嗎? – Raksa

0

有兩件事情......#1無論提供什麼參數值,函數都必須返回相同數量的列。因此,您不能根據@Qty在&關閉折扣欄。 #2多語句函數(mTVF)往往表現糟糕。您應該嘗試使您的功能成爲內聯功能(iTVF)。 請參見下面的建議重寫......

CREATE FUNCTION dbo.FDiscount (@ProdName varchar(50), @Qty int) 
RETURNS TABLE WITH SCHEMABINDING AS 
RETURN 
    SELECT 
     p.ProdName, 
     p.Price, 
     Qty = @Qty, 
     Total = p.Price * @Qty, 
     Discount10 = IIF(@Qty >= 10, (p.Price * @Qty) - (p.Price * @Qty)/100 * 10, 0) 
    FROM 
     dbo.TblProduct p 
    WHERE 
     p.ProdName = @ProdName; 
GO 

HTH, 傑森