我正在建立一个仓库管理程序,其中有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
答案 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;