0

我有一个场景,我必须将参数从一个临时表传递给一个存储过程

#student(table)
StudentID  Class
10008        A
10009        A
10010        C

sproc 接受 2 个参数 StudentID 和 Class。

Student_Fail @StudentID,@Class

我想为所有的学生 ID(3 次)执行这个存储过程。

如何才能做到这一点?使用while循环?

4

3 回答 3

1

理想情况下,您应该重新编写存储过程,以便它可以直接使用#temp 表,或者创建一个不同的存储过程,或者只是在此代码中复制存储过程尝试对单行执行的操作。(基于集合的操作几乎总是比一次处理一行更好。)

除此之外,您必须使用游标或 while 循环(不,它们并没有真正的不同)。

DECLARE @StudentID INT, @Class CHAR(1);

DECLARE c CURSOR LOCAL FAST_FORWARD
  FOR SELECT StudentID, Class FROM #student;

OPEN c;

FETCH c INTO @StudentID, @Class;

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC dbo.Student_Fail @StudentID, Class;
    FETCH c INTO @StudentID, @Class;
END

CLOSE c;
DEALLOCATE c;
于 2013-03-11T18:15:46.437 回答
1

正如您所指出的,while 循环将执行以下操作:

declare @StudentID int
declare @Class char(1)

while exists (select 1 from #student)
begin

  select top 1 @StudentID = StudentID
    , @Class = Class
  from #student

  exec Student_Fail @StudentID, @Class

  delete from #student where @StudentID = StudentID

end
于 2013-03-11T18:18:14.887 回答
1

是的,这可以实现为一个WHILE循环,或者一个CURSOR,因为在这种情况下,它们将执行基本相同的操作,即逐行操作。

但是,理想的解决方案是重新实现Student_Fail失败的存储过程,使其基于集合而不是过程。

例如,您可以更改存储过程以接受表值参数

首先,创建表类型:

CREATE TYPE dbo.StudentClassTableType AS TABLE
( StudentID int, Class varchar(50) )

接下来,更改存储过程(或创建新的存储过程)以接受表类型:

CREATE PROCEDURE dbo.usp_FailStudents
(@tvpStudentsToFail dbo.StudentClassTableType READONLY)
-- Perform set-based logic using your table parameter.
UPDATE sc
SET Fail = 1
FROM dbo.StudentClass sc
JOIN @tvpStudentsToFail fail 
  ON fail.StudentID = sc.StudentID 
  AND fail.Class = sc.Class
于 2013-03-11T18:20:00.220 回答