在另一个函数SQL Server 2012中调用该函数我做错了什么

时间:2015-04-26 17:41:09

标签: sql sql-server sql-server-2012

好的,这就是我应该回答的问题:

  
      
  1. 编写一个脚本,创建并调用名为fnItemTotal的函数,该函数计算OrderItems表中项目的总金额(折扣价格乘以数量)。为此,此函数应接受项ID的一个参数,它应使用您在练习2中创建的DiscountPrice函数,并且它应返回该项的总计值。
  2.   

这是我在第二个练习中使用调用它的函数编写的脚本:

    CREATE FUNCTION fnDiscountPrice
        (@ItemID int)
    RETURNS money
    BEGIN
        RETURN (SELECT SUM(ItemPrice - DiscountAmount) AS DP_ItemPrice
        FROM OrderItems
        WHERE ItemID = @ItemID);
    END;

    PRINT 'Discounot Price: $' + CONVERT (varchar, dbo.fnDiscountPrice(2));

这样可以正常工作并给我正确的折扣商品价格。

以下是我提出的问题的代码:

    CREATE FUNCTION fnItemTotal
        (@ItemID int)
    RETURNS money
    BEGIN
        RETURN (SELECT SUM (DP_ItemPrice * Quantity)
        FROM OrderItems JOIN dbo.fnDiscountPrice(@ItemID) AS DisPrice
            ON OrderItems.ItemID = DisPrice.ItemId
        WHERE ItemID = @ItemID)
    END;

    PRINT 'Item Price $' + CONVERT (varchar, dbo.fnItemTotal(5));

我试图在fnDiscountPrice函数中调用fnItemPrice函数。

当我运行调用PRINT函数的fnItemTotal命令时,我在SQL Server 2012的消息区域中收到此错误:

  

Msg 208,Level 16,State 3,Line 1
  无效的对象名称' dbo.fnDiscountPrice'。

我现在已经处理了这个问题2个小时,无法弄清楚我做错了什么。我的书没有任何好的参考资料让我离开。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

问题不在于调用函数;它与JOIN

仔细查看加入条件:

FROM OrderItems JOIN dbo.fnDiscountPrice(@ItemID) AS DisPrice
        ON OrderItems.ItemID = DisPrice.ItemId

dbo.fnDiscountPrice获取项ID并返回类型money的单个值。您的连接条件是,"使用函数结果集中的ItemId列将此函数的结果集连接到OrderItems。"

该函数不会生成结果集,因此它当然没有ItemId列。

您需要在标量上下文中调用该函数。

CREATE FUNCTION fnItemTotal(@ItemID int)
        RETURNS money
    BEGIN
        RETURN (
            SELECT SUM (dbo.fnDiscountPrice(ItemId) * Quantity)
            FROM OrderItems
            WHERE ItemID = @ItemID
        )
    END;

顺便说一句,我对SUM电话感到困惑。我在这个例子中留下了它,以防你真的需要它,但我怀疑你没有。如果ItemIDOrderItems表上的唯一标识符,那么这是一种更简单的方法:

CREATE FUNCTION fnItemTotal(@ItemID int)
        RETURNS money
    BEGIN
        RETURN (
            SELECT
                dbo.fnDiscountPrice(@ItemId) * (
                    SELECT Quantity
                    FROM OrderItems
                    WHERE ItemID = @ItemID
                )
        )
    END;

此版本只是说"去找折扣价","去找数量",然后将它们相乘并返回。