Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否有任何方法可以为所有选定的数据行执行存储过程?_Sql_Sql Server - Fatal编程技术网

Sql 是否有任何方法可以为所有选定的数据行执行存储过程?

Sql 是否有任何方法可以为所有选定的数据行执行存储过程?,sql,sql-server,Sql,Sql Server,我正在建立一个存储计划,其中我有两个表,一个用于产品,另一个用于材料 在产品表中,每个产品都有多个材料。有没有办法选择这些行和减量物料可用性 我尝试使用foreach循环,但无法实现它并存储每行数据 CREATE TABLE materials ( materialID INT PRIMARY KEY IDENTITY, materialName NVARCHAR(100) NULL, materialAmount INT NULL, ) CREATE TABLE p

我正在建立一个存储计划,其中我有两个表,一个用于产品,另一个用于
材料

产品
表中,每个产品都有多个
材料
。有没有办法选择这些行和减量
物料
可用性

我尝试使用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

您可以使用临时表和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 

由于我们没有样本作为依据,这只是一个猜测。但是,正如我所说,表类型参数似乎可以做到这一点:

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;

您说您尝试了“For each Loop”,是指
?你的企图是什么?请把它包括在你的问题中。听起来您应该使用表类型参数。样本数据和预期结果将帮助我们帮助您。样本数据和预期结果将帮助您。您将如何将临时表“传递”给SP?另外,如果可以更轻松地使用基于集合的操作,那么为什么要使用
WHILE
。WHILE循环可以为日志记录或使用游标提供一些优势,我认为游标的控制力较小。OP不需要将临时表传递给过程,只需要将表中的行传递给过程,这是通过ID和AMOUNT变量完成的。但是循环是一种非常慢的方法(我的意思是非常慢)。SQL不是一种编程语言,它是一种基于集合的语言。与基于集合的任务相比,像这样的迭代任务会执行得很糟糕。我同意你的方法更有效。我试图利用OP在SP方面已经拥有的东西