存储过程中的更新循环

时间:2014-08-15 14:24:04

标签: sql sql-server tsql

我目前正在创建一个订单数据库系统。我的SQL Server非常有限,所以这可能有一个我没有注意到的简单答案。有办法吗?

while($row = mysqli_fetch_array($result))
SQL Server中的

。我在订单确认时尝试更新库存。

这是我到目前为止所看到的,你可以在评论中看到我想要的东西。好吧,这就是我大脑的PHP部分。

--UPDATE ORDER -- 

IF EXISTS(SELECT NAME FROM SYS.OBJECTS WHERE NAME ='CONFIRMED_ORDER')
   DROP PROCEDURE CONFIRMED_ORDER
GO

CREATE PROCEDURE CONFIRMED_ORDER
   @ORDERID [INT],
   @PRODUCTID [INT],
   @ORDERSTATUS [NCHAR](10),
   @STOCK [INT],
   @QUANTITY[INT],
   @CURRENTSTOCK[INT]
AS
BEGIN
   BEGIN TRY
      UPDATE ORDERS
      SET ORDERSTATUS = @ORDERSTATUS 
      WHERE ORDERID = @ORDERID;

      IF (@ORDERSTATUS = 'Confirmed')
      BEGIN
          SET @PRODUCTID = (SELECT PRODUCTCODE 
                            FROM ORDERLINES 
                            WHERE ORDERID = @ORDERID);

          /*WHILE (@PRODUCTID)
          SET @QUANTITY = SELECT QUANTITY 
                          FROM ORDERLINES 
                          WHERE ORDERID = @ORDERID AND PRODUCTCODE = @PRODUCTID;

          SET @CURRENTSTOCK = SELECT UNITSINSTOCK 
                              FROM PRODUCTS 
                              WHERE PRODUCTCODE = @PRODUCTID;

          UPDATE PRODUCTS
          SET UNITSINSTOCK = @CURRENTSTOCK - QUANTITY;*/
    END
 END TRY
 BEGIN CATCH
    SELECT ERROR_NUMBER() AS ERRORNO, ERROR_MESSAGE() AS ERRORMSG
    ROLLBACK
END CATCH
END
GO 

正如我所说的那样,我对SQL相当有限,所以任何答案,即使说这是不可能的,也会非常感激。

提前致谢。

2 个答案:

答案 0 :(得分:5)

正如我在评论中所说,你根本不需要一个循环。你只需要在SQL中本地思考,而不是尝试编写与PHP相同的东西:

update [Products]
 set [UnitsInStock] = [UnitsInStock] - OL.[Quantity]
from [Products] P
inner join [OrderLines] OL on OL.[ProductCode] = P.[ProductCode]
where OL.[OrderId] = @OrderId

这将在一个声明中更新订单中所有产品的所有“库存”。

请注意,这假设每个产品ID只有一个订单行 - 如果您不确保没有重复,则需要稍微更改一下,以便将单个产品ID的所有行汇总在一起。

哦,你正在将程序参数与局部变量混合在一起。以你的方式声明参数,然后在as之后执行局部变量声明,例如:

declare 
        @STOCK [INT],
        @QUANTITY[INT],
        @CURRENTSTOCK[INT];

答案 1 :(得分:1)

您可以在IF

中使用此功能
UPDATE PRODUCTS
SET UNITSINSTOCK = UNITSINSTOCK - ISNULL(@QUANTITY,0)
WHERE PRODUCTCODE = @PRODUCTID;

对于LOOP,您应该创建此客户端...

while($row = mysqli_fetch_array($result))
 //call sp