我目前正在创建一个订单数据库系统。我的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相当有限,所以任何答案,即使说这是不可能的,也会非常感激。
提前致谢。
答案 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