【问题标题】:Stored procedure to insert values in a table where JOINS are involved在涉及 JOINS 的表中插入值的存储过程
【发布时间】:2020-03-24 14:26:30
【问题描述】:

这是程序:

CREATE PROCEDURE mysp_AddOrderLine
    (@pOrderId INT,
     @pQuantity INT,
     @pRestaurantId INT,
     @pFoodId INT)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO SALES.OrderLine (OrderId, Quantity, RestaurantId, FoodId, LineTotal)
        SELECT 
            @pOrderId, @pQuantity, @pRestaurantId, @pFoodId, 
            SUM(SOL.Quantity * F.UnitPrice) 
        FROM 
            SALES.OrderLine SOL 
        INNER JOIN 
            RESTAURANT.Food F ON SOL.FoodId = F.FoodId
        -- Do you also need to filter on @pRestaurantId
        WHERE 
            SOL.OrderId = @pOrderId AND SOL.FoodId = @pFoodId;

    RETURN 0
END

DECLARE @pOrderId INT = 515, @pQuantity INT = 2, 
        @pRestaurantId INT = 6, @pFoodId INT = 24;

EXEC mysp_AddOrderLine @pOrderId, @pQuantity, @pRestaurantId, @pFoodId;

OrderLine 表目前没有值,所以我在其中插入新值。 它具有像 OrderLineId 是一个身份的属性,OrderIdOrder 表返回,Quantity 我们必须通过存储过程插入它,RestaurantIdRestaurant 表和 @987654330 返回@ 来自Food 表。

请参阅随附的屏幕截图。为什么LineTotalOrderLine 表中为空?应该是 12 * 2 = 24?

SampleImage

【问题讨论】:

  • 我不明白你的问题,值应该是你需要的值,让你的 SP 返回你想要的结果集。
  • 不要认为参数 pLineTotal 应该是存储过程的一部分。它不是您传递给 SP 的参数。它似乎是内部计算的。您的创建过程不应该有这个 >>, @pLineTotal money 。只需在 SP 内部使用公式声明并设置它。
  • 这行得通,我还修改了逻辑 SELECT @pLineTotal = (SOL.Quantity*F.UnitPrice)。然而,结果并不正确。 OrderLineId OrderId Qty RestaurantId FoodId LineTotal 39 515 2 6 24 NULL 40 516 3 2 30 24.00 41 517 5 8 32 48.00 获取 LineTotal 的结果为 NULL 的第一列和第一行 LineTotal 结果存储在第二行 LineTotal 结果和结果第二行 LineTotal 存储在第三行。不知道发生了什么。
  • @Neha 您缺少where 子句,请参阅下面的答案。
  • @Neha 另一个问题,但你真的想在订单中添加 another OrderLine 以包含sum 吗?或者您真的想用linetotal 更新现有的orderline

标签: sql-server tsql join stored-procedures


【解决方案1】:

@pLineTotal这个变量根本就不需要存在,按照下面的方式计算并插入即可。还要注意以下几点:

  1. 不要为您的 SP 加上 sp 前缀,它与 sp_ 太接近,这是一个特殊的系统前缀。
  2. 您可以一次性定义和设置多个变量,IMO 更加简洁易读。
  3. 我已经猜到了,但如果您想对给定订单的订单商品求和,我认为您缺少 where 子句。
    CREATE PROCEDURE mysp_AddOrderLine
    (
      @pOrderId int
      , @pQuantity int
      , @pRestaurantId int
      , @pFoodId int
    )
    AS
    BEGIN
      SET NOCOUNT ON;

      INSERT INTO SALES.OrderLine(OrderId, Quantity, RestaurantId, FoodId, LineTotal)
        SELECT @pOrderId, @pQuantity, @pRestaurantId, @pFoodId, SUM(SOL.Quantity*F.UnitPrice) 
        FROM SALES.OrderLine SOL 
        INNER JOIN RESTAURANT.Food F ON SOL.FoodId = F.FoodId
        -- Do you also need to filter on @pRestaurantId
        WHERE SOL.OrderId = @pOrderId and SOL.FoodId = @pFoodId;

      RETURN 0;
    END

    DECLARE @pOrderId INT = 516, @pQuantity INT = 2, @pRestaurantId INT = 6, @pFoodId INT = 24;

    EXEC mysp_AddOrderLine @pOrderId, @pQuantity, @pRestaurantId, @pFoodId;

为了对此进行测试,我需要一些示例数据,格式如下:

declare @Food table (FoodId int, UnitPrice money)

insert into @Food (FoodId, UnitPrice)
  values (2,12), (32,2), (30,16), (22,10)

declare @OrderLine table (FoodId int, OrderLineId int, OrderId int, Quantity int)

insert into @OrderLine (FoodId, OrderLineId, OrderId, Quantity)
 values (2,1,1,2), (32,1,1,5), (30,1,1,7), (22,1,1,2)

declare @pOrderId int = 1
  , @pQuantity int
  , @pRestaurantId int
  , @pFoodId int = 2

select * from @Food
select * from @OrderLine

SELECT @pOrderId, @pQuantity, @pRestaurantId, @pFoodId
  , SUM(SOL.Quantity*F.UnitPrice)
  --, SOL.Quantity, F.UnitPrice 
FROM @OrderLine SOL 
INNER JOIN @Food F ON SOL.FoodId = F.FoodId
where SOL.OrderId = @pOrderId and SOL.FoodId = @pFoodId;

注意:如果您实际上是在尝试添加新的 OrderLine,也许您实际上想要添加一条新记录并计算总行数:

INSERT INTO SALES.OrderLine(OrderId, Quantity, RestaurantId, FoodId, LineTotal)
  SELECT @pOrderId, @pQuantity, @pRestaurantId, @pFoodId, @pQuantity*F.UnitPrice) 
  FROM RESTAURANT.Food F
  WHERE F.FoodId = @pFoodId;

【讨论】:

  • 谢谢。上面的代码将所有行的 LineTotal 返回为 NULL。如果我对 LineTotal = SOL.Quantity*F.UnitPrice 之类的逻辑进行一些小的更改,上面的代码不会返回任何值,我只会看到只有列名的所有内容都是空白的,没有任何行受到影响。
  • @Neha 您需要提供一些示例数据和预期结果,然后我才能对其进行测试。
  • 我给出了四个示例输入:(FoodId,UnitPrice) --(24,12) (32,2) (30,16) (22,10) 它在 Food TABLE 和 OrderLine 中表应该自动插入 LineTotal。OrderLine TABLE 中还有其他属性,例如 OrderLineId 是身份,OrderId,数量是(2,5,7,2),RestaurantId 和 FoodId(24,32,30,22),它来自食物表。最后我的 LineTotal 应该是 (12*2),(2*5),(16*7),(10*2) 前 4 行。但是,如果我使用 SP 插入相同的值,则前四行将得到 NULL,它是正确的。任何东西的第一次插入总是 NULL。
  • edit他们直接进入问题并格式化它们 - 无法从评论中读取数据,
  • @Alex - 我希望我知道 :) 预期的行为和结果有点欠缺。我怀疑不是,因为我怀疑参数指定了需要求和的特定顺序。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多