2017-07-22 5 views
0

は、私は、テーブル内の他の文が大切ならば数量が終わっまたは等しい10であれば、私は10を与えるようにそれを作るために関数を使用するテーブル表でElseステートメント値関数

ProdID, ProdName, Price 

を持っている場合%割引、それ以外の割引はありません。これは私のコードです。

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 - はい、私たちは.. Multilineテーブル値関数を使用しますが、なぜですか?パフォーマンスは賢明ですインラインはマルチライン機能よりも速いでしょう。それをしないでください –

+0

それはちょうど私が知りたいことです、あなたは私を見せてくれる? – Raksa

0

2つの関数...#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、 ...提案書き換えとして、以下を参照してくださいジェイソン

関連する問題