Я инкапсулировал команду резервного копирования базы данных в Try / Catch, и похоже, что сообщение об ошибке где-то теряется. Например:
BACKUP DATABASE NonExistantDB TO DISK = 'C:\TEMP\NonExistantDB.bak'
.. дает ошибку:
Не удалось найти запись в системных базах данных для базы данных «NonExistantDB». Записи с таким именем не найдены. Убедитесь, что имя введено правильно. BACKUP DATABASE аварийно завершает работу.
Тогда как:
BEGIN TRY
BACKUP DATABASE NonExistantDB TO DISK = 'C:\TEMP\NonExistantDB.bak'
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
END CATCH
... выдает только ошибку: BACKUP DATABASE аварийно завершает работу.
Есть ли способ получить полное сообщение об ошибке или это ограничение try / catch?





Это ограничение try / catch.
Если вы внимательно посмотрите на ошибку, возникающую при выполнении
BACKUP DATABASE NonExistantDB TO DISK = 'C:\TEMP\NonExistantDB.bak'
вы обнаружите, что возникают две ошибки. Первая - это сообщение 911, в котором говорится:
Could not locate entry in sysdatabases for database 'NonExistantDB'. No entry found with that name. Make sure that the name is entered correctly.
Второе - это отображаемое вами сообщение 3013. По сути, SQL возвращает только последнюю ошибку.
Я только что столкнулся с ограничением блока try / catch в SQL 2005. Я не знаю, существует ли он еще в 2008 году или нет.
Похоже, вы правы, но не об ограничении try / catch. Я только что запустил его, используя @@ ERROR, и он также возвращает только последнюю ошибку. не msg 911. Итак, как, черт возьми, мы должны получить первую ошибку или все ошибки.