Я не могу использовать THROW SQL Server 2008 R2

17

SQL Server 2008 R2 Management Studio не распознает мой бросок в приведенном ниже примере, он говорит

  

неправильный синтаксис рядом с Throw

Я пытаюсь сделать ошибку здесь, поэтому я могу обработать ее на своем веб-сайте, когда кто-то дважды вставляет то же значение.

Begin Try
 insert into BusinessID (BusinessID) values (@ID)
 insert into BusinessID (BusinessID) values (@ID)

End Try

Begin Catch

Print 'PK already exist'
THROW
End Catch
    
задан user2405574 21.05.2013 в 15:14
источник
  • THROW - это новая функция в SQL Server 2012 и, следовательно, она еще не доступна в 2008 R2. ..... –  marc_s 21.05.2013 в 15:35
  • Furthemore, похоже, вам нужно прекратить утверждение, предшествующее THROW точкой с запятой; иначе вы получите синтаксическую ошибку! –  joedotnot 11.03.2016 в 07:19

2 ответа

36

THROW Заявление введено в SQL Server 2012

Ссылка

Вместо этого вы можете использовать RAISERROR .

Ссылка

BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;
    
ответ дан Nenad Zivkovic 21.05.2013 в 15:17
источник
  • Большое спасибо, все, что мне нужно, это небольшая информация, которую Throw представляет на SQL-сервере 2012 года, и спасибо за разъяснение заявления RAISERROR –  user2405574 21.05.2013 в 16:36
  • Небольшая разница. RAISERROR не прекращает выполнение, тогда как THROW делает. –  Mehmet AVŞAR 16.04.2016 в 15:50
  • @ MehmetAVŞAR Это не совсем правильно. Выполнение не прекращается в зависимости от того, что это RAISERROR или THROW, оно остановилось на основании уровня серьезности. С помощью RAISERROR вы можете сами определить степень серьезности, а затем выбрать, какое действие будет остановлено. С помощью THROW вы не можете и по умолчанию - 16, что останавливает выполнение, однако при использовании из блока CATCH он просто пересылает последнее известное исключение, которое может быть или не быть 16. –  Nenad Zivkovic 19.04.2016 в 08:49
  • @NenadZivkovic Я только что попробовал снова, и уровень ошибки 17 не прекращает выполнение. Это просто требует, чтобы пользователь был членом sysadmin для повышения ошибок с уровнем выше 18. CREATE PROCEDURE RaiseMeAnError AS PRINT «Шаг 1» RAISERROR («Вот ошибка низкого уровня», 1, 1) ПЕЧАТЬ «Шаг 2» RAISERROR («Вот ошибка низкого уровня», 17, 1) ПЕЧАТЬ «Шаг 3» –  Mehmet AVŞAR 19.04.2016 в 16:22
  • @ MehmetAVŞAR PRINT - это определенная команда, когда дело доходит до плана выполнения, и SQL запустил его до того, как он получил сообщение об ошибке, попробуйте заменить его SELECT в вашем демо-коде, и вы увидите, что третий выбор не произойдет. –  Nenad Zivkovic 20.04.2016 в 16:42
Показать остальные комментарии
3

Используйте RAISERROR вместо Throw в своем блоке sql.

Begin Try
 insert into BusinessID (BusinessID) values (@ID)
 insert into BusinessID (BusinessID) values (@ID)

End Try

Begin Catch

Print 'PK already exist'
  DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

SELECT 
    @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();

-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
           @ErrorSeverity, -- Severity.
           @ErrorState -- State.
           );
End Catch
    
ответ дан Pawan 21.05.2013 в 15:20
источник
  • Спасибо за ваше предложение и за то, что вы применили свое предложение на моем точном примере :) –  user2405574 21.05.2013 в 16:37
  • Что делать, если ERROR_MESSAGE () LIKE '% [%] s%' или что-то еще? –  binki 23.11.2016 в 05:25