Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как выкинуть исключение 2627 из блока TRY?  [new]
posdnyaa
Member

Откуда:
Сообщений: 45
Здравствуйте.
Имеется таблица с первичным ключом ID и ограничением на UNIQUE KEY столбец myUnique. Т.е. два одинаковых значения в него не вставить.
Из хранимой процедуры делаю UPDATE. И в случае если в поле myUnique попытаться вставить уже имеющееся в нем значение, то вылетит исключение:
Сообщение 2627, уровень 14, состояние 1, процедура aud_US_Edit, строка 18
Нарушение "UQ__CBS_USTable__1CA7377D" ограничения UNIQUE KEY. Невозможно вставить повторяющийся ключ в объект "dbo.CBS_USTable".

Всё так и должно быть.
Теперь мне необходимо выполнить UPDATE внутри транзакции (ибо там внутри еще должны быть операции).
BEGIN TRY
BEGIN TRANUPDATE…
…
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
В этом случае ошибка вообще не отлавливается (это понятно).
Если в блоке CATCH попытаться вызвать RAISERROR
DECLARE @ErrorMessage NVARCHAR(max);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity,@ErrorState);
То почему-то возвращается ошибка 50000
Сообщение 50000, уровень 14, состояние 1, процедура aud_US_Edit, строка 69
Нарушение "UQ__CBS_USTable__1CA7377D" ограничения UNIQUE KEY. Невозможно вставить повторяющийся ключ в объект "dbo.CBS_USTable".

Хотя номер должен быть 2627. Конечно же значение ERROR_NUMBER() содержит значение 2627, но если пользоваться им, то придется номер ошибки возвращать в мое приложение через параметр хранимой процедуры, а мне бы хотелось SQL server сам выкидывал это исключение и в своем приложении обрабатывать как раз его. Вдруг там другие ошибки появятся
Скажите, пожалуйста, как мне получить сообщение из первого примера, но при условии использования транзакции.
Спасибо.
11 авг 09, 12:26    [7521721]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть исключение 2627 из блока TRY?  [new]
Glory
Member

Откуда:
Сообщений: 104760
posdnyaa

То почему-то возвращается ошибка 50000
Сообщение 50000, уровень 14, состояние 1, процедура aud_US_Edit, строка 69
Нарушение "UQ__CBS_USTable__1CA7377D" ограничения UNIQUE KEY. Невозможно вставить повторяющийся ключ в объект "dbo.CBS_USTable".

Хотя номер должен быть 2627. Конечно же значение ERROR_NUMBER() содержит значение 2627, но если пользоваться им, то придется номер ошибки возвращать в мое приложение через параметр хранимой процедуры, а мне бы хотелось SQL server сам выкидывал это исключение и в своем приложении обрабатывать как раз его. Вдруг там другие ошибки появятся
Скажите, пожалуйста, как мне получить сообщение из первого примера, но при условии использования транзакции.
Спасибо.

BOL - RAISERROR

msg_id -
Is a user-defined error message number stored in the sys.messages catalog view using sp_addmessage. Error numbers for user-defined error messages should be greater than 50000. When msg_id is not specified, RAISERROR raises an error message with an error number of 50000.
11 авг 09, 12:37    [7521808]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть исключение 2627 из блока TRY?  [new]
Mayh
Guest
а в чем сложность сделать два блока try catch?
в одном проверять инсерт в другом делать апдейт
11 авг 09, 12:39    [7521822]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть исключение 2627 из блока TRY?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
posdnyaa

Скажите, пожалуйста, как мне получить сообщение из первого примера, но при условии использования транзакции.
Спасибо.

создать пользовательское сообщение об ошибке связанное непосредственно с нарушением уникальности на это ваше myUnique...
11 авг 09, 12:45    [7521882]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить