Повторно выполнить хранимую процедуру - PullRequest
1 голос
/ 09 июня 2010

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

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

теперь курсор ищет все строки со статусом 'New'

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

как мне это сделать?Кроме того, также, в то время как мы находимся, что, если у 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

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

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

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

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

2 голосов
/ 09 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...