好的,这就是我应该回答的问题:
- 编写一个脚本,创建并调用名为fnItemTotal的函数,该函数计算OrderItems表中项目的总金额(折扣价格乘以数量)。为此,此函数应接受项ID的一个参数,它应使用您在练习2中创建的DiscountPrice函数,并且它应返回该项的总计值。
醇>
这是我在第二个练习中使用调用它的函数编写的脚本:
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个小时,无法弄清楚我做错了什么。我的书没有任何好的参考资料让我离开。任何帮助都会很棒。
答案 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
电话感到困惑。我在这个例子中留下了它,以防你真的需要它,但我怀疑你没有。如果ItemID
是OrderItems
表上的唯一标识符,那么这是一种更简单的方法:
CREATE FUNCTION fnItemTotal(@ItemID int)
RETURNS money
BEGIN
RETURN (
SELECT
dbo.fnDiscountPrice(@ItemId) * (
SELECT Quantity
FROM OrderItems
WHERE ItemID = @ItemID
)
)
END;
此版本只是说"去找折扣价","去找数量",然后将它们相乘并返回。