0

temptable からストアド プロシージャにパラメーターを渡す必要があるシナリオがあります。

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

sproc は、StudentID と Class の 2 つのパラメーターを受け入れます。

Student_Fail @StudentID,@Class

このストアド プロシージャをすべての StudentID (3 回) に対して実行したいと思います。

これはどのように行うことができますか?whileループを使用していますか?

4

3 に答える 3

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

理想的には、ストアド プロシージャを書き直して、#temp テーブルを直接使用するか、別のストアド プロシージャを作成するか、ストアド プロシージャが単一の行に対して実行しようとすることをこのコードで複製できるようにする必要があります。(一度に 1 つの行を処理するよりも、ほとんどの場合、セットベースの操作の方が優れています。)

それ以外では、カーソルまたは 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はい、これはループとして、または として実装できます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 に答える