Используя T-SQL, как я могу поймать код ошибки ОС?
Microsoft SQL Server 2005+
При выполнении резервного копирования базы данных я могу получить эту ошибку в SSMS:
Сообщение 3202, уровень 16, состояние 2, строка 5
Ошибка записи на "c:\dbbackup\dummy.bak": 112(На диске недостаточно места.)
Здесь 112 - это код ошибки ОС, а текст в скобках - это текст ошибки ОС.
Мой вопрос: как я могу получить эту информацию программно?
Если я помещу команду BACKUP в блок TRY-CATCH, я смогу использовать функции ERROR_*(), но ни одна из них не содержит этой информации.
Упомянутые функции ERROR_*():
- ERROR_ NUMBER (),
- ERROR_ MESSAGE ()
- ОШИБКА_ СЕВЕРНОСТЬ ()
- ERROR_ STATE ()
- ОШИБКА_ ПРОЦЕДУРА ()
- ERROR_ LINE ()
Я могу только поймать информацию, которая отображается в первой строке сообщения об ошибке (Msg 3202... и т. Д.), А также текст ошибки SQL: "BACKUP DATABASE завершается ненормально" (это возвращается функцией ERROR_MESSAGE()).
2 ответа
Блок Catch вернет только последнюю / завершающую ошибку. Для этого есть пункт Connect: https://connect.microsoft.com/SQLServer/feedback/details/277335/incorrect-error-number-passed-to-catch-block
SSMS является приложением.net и использует SqlExeption для перехвата всех исключений в пакете. Свойство Errors - это SqlErrorCollection, которая будет содержать все ошибки (в зависимости от настроек XACT_ABORT). В настоящее время это невозможно с T-SQL с использованием TRY/CATCH
Янос Берке был так добр и ответил на вопрос. Ссылка: http://iamberke.com/post/2014/06/14/egymast-koveto-tobb-sql-hiba-kezelese.aspx Текст написан на венгерском языке, но дело в том, что в принципе этого нельзя сделать чисто TSQL: вам нужен объект.NET SQLException, чтобы поймать несколько ошибок. Пример кода можно найти по ссылке. Спасибо Янош.