2013-03-11 6 views
0

У меня есть Senario, где я должен передать параметры хранимой процедуре из TempTableпередачи параметров хранимой процедуры из временной таблицы

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

sproc принимает 2 параметра StudentID и класса.

Student_Fail @StudentID,@Class 

Я хотел бы выполнить эту хранимую процедуру для всего студенческого идентификатора (3 раза).

Как это можно сделать? используя цикл while?

ответ

1

В идеале вы должны перезаписать хранимая процедура, чтобы она могла просто использовать таблицу #temp напрямую или создать другую хранимую процедуру или просто реплицировать в этом коде то, что хранимая процедура пытается сделать для одной строки , (Операции, основанные на настройках, почти всегда лучше обработки по одной строке за раз.)

Для этого вам нужно будет использовать курсор или цикл while (and no they aren't really different).

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; 
1

Как вы указали, в то время как цикл будет делать:

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 
1

Да, это может быть реализовано в виде WHILE цикла, или как CURSOR, так как в этом случае они будут делать по существу то же самое, пошаговая операция.

Однако идеальным решением было бы повторное внедрение процедуры хранения с ошибкой Student_Fail, чтобы сделать ее установленной, а не процедурной.

Например, вы можете изменить хранимую процедуру, чтобы принять table-valued parameter.

Во-первых, создать тип таблицы:

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