2010-06-09 10 views
1

У меня есть ситуации, когда мне нужно повторно выполнить хранимую процедуру Теперь эту процедуру (spMAIN) имеет курсор, внутри которого выглядит для значения из таблицы, как T1, который имеет следующую структуруМногократно выполнение хранимой процедуры

ID  Status 
---- -------- 
1  New 
2  New 
3  success 
4  Error 

теперь курсор выглядит для всех строк со статусом «Новый»

Теперь при обработке, если этот экземпляр курсора обнаруживает ошибку, другой SP сказать spError должен быть вызван, «Статус» столбец в T1 необходимо обновить до «Ошибка», и необходимо снова вызвать spMAIN, который снова повторяет процесс, ищет строки с «новым»

Как мне это сделать? Кроме того, в то время как мы находимся в нем, что, если SP имеет другие SP внутри него, и если какой-либо из этих SP вызывает ошибку, то же самое нужно сделать, таблица T1 нуждается в обновлении («Ошибка») и Необходимо снова вызвать spMAIN.

Вы также можете порекомендовать что-нибудь?

вот некоторый код

ALTER PROC zzSpMain 
AS 
    BEGIN 
     DECLARE @id INT 
     BEGIN TRY 
     IF EXISTS (SELECT * 
        FROM  dbo.zzTest 
        WHERE istatus = 'new') 
      BEGIN 


       DECLARE c CURSOR 
        FOR SELECT id 
         FROM zztest 
         WHERE istatus = 'new' 

       OPEN c 
       FETCH NEXT FROM c INTO @id 

       WHILE @@FETCH_STATUS = 0 
        BEGIN 
        PRINT @id 


        IF @id = 2 
         BEGIN   
          UPDATE zztest 
          SET  istatus = 'error' 
          WHERE id = @id 
          RAISERROR ('Error occured', 16, 
           1) 
         END 

        UPDATE zztest 
        SET  istatus = 'processed' 
        WHERE id = @id 

        FETCH NEXT FROM c INTO @id 
        END 
       CLOSE c 
       DEALLOCATE c 

      END 

     END TRY 
     begin CATCH 

     EXEC zzSpError 
     END CATCH 

    END 
+4

Каждый раз, когда я вижу, курсор обычно я уверен, что есть лучший, более РСУБД установить стиль способ сделать то, что нужно. – Joe

ответ

2

Вы можете выполнить обработку ошибок с функциональностью TRY CATCH, который встроен в SQL Server, начиная с SQL Server 2005. Я рекомендую вам пересмотреть вашу логику запроса и посмотреть на чем-то вроде SQL CLR или оператора MERGE. Судя по образцу кода, это должен быть особенно простой путь.

2

Все эти рамки кажутся прекрасными, поэтому я не уверен, в чем проблема (TRY/CATCH и повторная ошибка, если у вас много вложенных SP).

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

Но, не зная больше о вашей основной мотивации ...

Смежные вопросы