Используя 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, чтобы поймать несколько ошибок. Пример кода можно найти по ссылке. Спасибо Янош.

Другие вопросы по тегам