У нас есть большое приложение, в основном написанное на SQL Server 7.0, где все вызовы базы данных хранятся в хранимых процедурах. Теперь мы запускаем SQL Server 2005, который предлагает больше возможностей T-SQL.
После почти всех SELECT, INSERT, UPDATE и DELETE, @@ROWCOUNT и @@ERROR попадают в локальные переменные и оцениваются по проблемам. Если возникла проблема, выполните следующие действия:
- установлен параметр вывода сообщения об ошибке
- откат (если необходимо)
- информация записывается (INSERT) для записи таблицы
- return с номером ошибки, уникальным для этой процедуры (положительный, если фатальный, отрицательный - предупреждение)
Все они не проверяют строки (только когда это известно), а некоторые отличаются более или менее информацией об ошибках/отладочной информации. Кроме того, логика строк когда-то расщепляется от логики ошибок (при обновлениях, где поле concurrency отмечено в предложении WHERE, rows = 0 означает, что кто-то еще обновил данные). Однако здесь довольно общий пример:
SELECT, INSERT, UPDATE, or DELETE
SELECT @[email protected]@ERROR, @[email protected]@ROWCOUNT
IF @Rows!=1 OR @Error!=0
BEGIN
SET @ErrorMsg='ERROR 20, ' + ISNULL(OBJECT_NAME(@@PROCID), 'unknown')
+ ' - unable to ???????? the ????.'
IF @@TRANCOUNT >0
BEGIN
ROLLBACK
END
SET @LogInfo=ISNULL(@LogInfo,'')+'; '+ISNULL(@ErrorMsg,'')+
+ ' @YYYYY=' +dbo.FormatString(@YYYYY)
+', @XXXXX=' +dbo.FormatString(@XXXXX)
+', Error=' +dbo.FormatString(@Error)
+', Rows=' +dbo.FormatString(@Rows)
INSERT INTO MyLogTable (...,Message) VALUES (....,@LogInfo)
RETURN 20
END
Я изучаю замену того, как мы это делаем с TRY-CATCH T-SQL. Я читал о синтаксисе TRY... CATCH (Transact-SQL), поэтому не просто публикуйте некоторые сводки об этом. Я ищу любые хорошие идеи и как лучший делать или улучшать наши методы обработки ошибок. Это не должно быть Try-Catch, просто любая хорошая или лучшая практика использования обработки ошибок T-SQL.