Sql server 表值函数中的If-Else语句

Sql server 表值函数中的If-Else语句,sql-server,Sql Server,我有一张桌子 ProdID, ProdName, Price 我想在表值函数中使用if-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

我有一张桌子

ProdID, ProdName, Price
我想在表值函数中使用if-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'附近的语法不正确,我似乎找不到任何解决方法。”

用这个

Create function FDiscount (@ProdName varchar(50), @Qty int)
Returns @tblTable(ProdName VARCHAR(100), Price INT, Qty INT, Discount10 INT)
as
BEGIN
    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 

为什么不是一个简单的
案例
语句

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) 
有两件事…#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
嗯,,
Jason

这就是程序所说的“具有返回值的返回语句不能在此上下文中使用”。但是,使用IF语句有可能吗?@Raksa-是的,我们可以..使用多行表值函数,但为什么?性能方面的内联将比多行函数更快..不要这样做