Есть ли способ выполнить хранимую процедуру для всех выбранных строк данных? - PullRequest
0 голосов
/ 19 октября 2019

Я настраиваю программу управления запасами, в которой у меня есть 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 голосов
/ 19 октября 2019

Поскольку у нас нет образца, на котором можно основывать это, это предположение. Однако, как я уже сказал, похоже, что параметр табличного типа сделает это:

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;
0 голосов
/ 19 октября 2019

Вы можете использовать временную таблицу и цикл 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...