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方面已经拥有的东西