有什么方法可以执行所有选定数据行的存储过程吗?

时间:2019-10-19 16:09:53

标签: sql sql-server

我正在建立一个仓库管理程序,其中有2个表,一个表用于产品,另一个表用于materials

products表中,每个产品都有几个materials。有什么方法可以选择这些行并减少materials的可用性?

我尝试使用foreach循环,但无法实现它并存储每行数据

CREATE TABLE materials 
(
    materialID INT PRIMARY KEY IDENTITY,
    materialName NVARCHAR(100) NULL,
    materialAmount INT NULL,
)

CREATE TABLE productStack
(
    ID INT PRIMARY KEY IDENTITY,
    productsID INT NULL,
    materialID INT NULL,
    amount INT NULL
)
GO;

CREATE PROCEDURE updateMaterials
    (@ID INT,
     @AMOUNT INT)
AS
BEGIN
    UPDATE materials
    SET materialAmount = (materialAmount - @AMOUNT)
    WHERE materialID = @ID
END

2 个答案:

答案 0 :(得分:0)

您可以使用临时表和while循环,例如:

SELECT * INTO #TEMP_A FROM PRODUCTSTACK

DECLARE @ID INT,@AMOUNT INT

WHILE EXISTS(SELECT * FROM #TEMP_A)
BEGIN
   SET @ID = (SELECT TOP 1 ID FROM PRODUCTSTACK)
   SET @AMOUNT = (SELECT TOP 1 AMOUNT FROM PRODUCTSTACK WHERE ID = @ID)
   EXEC UPDATEMATERIALS @ID,@AMOUNT
   DELETE FROM #TEMP_A WHERE ID = @ID
END 

答案 1 :(得分:0)

由于我们没有基于此的示例,因此这是一个猜测。就像我说的那样,似乎是一个表类型的参数可以做到这一点:

CREATE TYPE dbo.MaterialAmount AS table (ID int, Amount int);
GO

CREATE PROC dbo.UpdateMaterials @Materials dbo.MaterialAmount READONLY AS
BEGIN

    UPDATE M
    SET materialAmount = MA.Amount
    FROM dbo.materials M
         JOIN @Materials MA ON M.materialID = MA.ID;
END;
GO

--Example of usage:

DECLARE @Materials dbo.MaterialAmount;
INSERT INTO @Materials
VALUES(1,100),
      (5,20);

EXEC dbo.UpdateMaterials @Materials;