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

Откуда:
Сообщений: 76
error_message() в try/catch содержит только последнюю часть ошибки, эта часть наименее информативна.
Например, если ошибка:
Msg 1770, Level 16, State 0, Line 18
Foreign key 'FK_tblInvoice_tblCustomer' references invalid column 'CustomerIDDDDD' in referenced table 'dbo.tblCustomer'.

Msg 1750, Level 16, State 0, Line 18
Could not create constraint. See previous errors.


В этом случае error_message() будет содержать только:
Msg 1750, Level 16, State 0, Line 18
Could not create constraint. See previous errors.


Как можно узнать полный текст ошибки.
Понятно, конечно, что фактически это несколько ошибок, вызванных одной проблемой, и тем не менее - как получить их все целиком?

Спасибо!
13 фев 12, 18:25    [12083844]     Ответить | Цитировать Сообщить модератору
 Re: error_message() содержит только последнюю часть ошибки  [new]
Glory
Member

Откуда:
Сообщений: 104751
dukt
Например, если ошибка:
Msg 1770, Level 16, State 0, Line 18
Foreign key 'FK_tblInvoice_tblCustomer' references invalid column 'CustomerIDDDDD' in referenced table 'dbo.tblCustomer'.

Msg 1750, Level 16, State 0, Line 18
Could not create constraint. See previous errors.

Это две ошибки, а не одна
13 фев 12, 18:28    [12083872]     Ответить | Цитировать Сообщить модератору
 Re: error_message() содержит только последнюю часть ошибки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Есть подозрение, что только в клиентском приложении. Сделать фичу сделали, но до ума, как водится, еще пилить и пилить.
13 фев 12, 18:28    [12083878]     Ответить | Цитировать Сообщить модератору
 Re: error_message() содержит только последнюю часть ошибки  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Гавриленко Сергей Алексеевич
Есть подозрение, что только в клиентском приложении. Сделать фичу сделали, но до ума, как водится, еще пилить и пилить.


именно. та же проблема с бакапами. там тоже "смысловая" часть ошибки теряется
13 фев 12, 18:37    [12083955]     Ответить | Цитировать Сообщить модератору
 Re: error_message() содержит только последнюю часть ошибки  [new]
Andret
Member

Откуда: Киев
Сообщений: 84
Поэтому, редко пользуюсь try-catch, старый добрый
if @@error <> 0 begin .... goto err end 
старичок обычно выручает. В секции err: генеришь свою ошибку, а на клиенте в коллекции всегда имеешь полный стек - знаешь откуда что вызвалось, и видишь все накопленные ошибки. Если бы MS что-то достойное, наконец на замену предложило, но мечты, мечты :(
13 фев 12, 19:45    [12084459]     Ответить | Цитировать Сообщить модератору
 Re: error_message() содержит только последнюю часть ошибки  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Andret
Поэтому, редко пользуюсь try-catch, старый добрый


а там ровно та же проблема. в целом любой оператор может насыпать коллекцию сообщений разного уровне серьезности
с клиента все хорошо - получаем коллекцию
а вот на сервер-сайде про это не подумали
13 фев 12, 20:07    [12084602]     Ответить | Цитировать Сообщить модератору
 Re: error_message() содержит только последнюю часть ошибки  [new]
Andret
Member

Откуда: Киев
Сообщений: 84
Crimean

а там ровно та же проблема. в целом любой оператор может насыпать коллекцию сообщений разного уровне серьезности
с клиента все хорошо - получаем коллекцию
...


Разве ?
try прячет оригинальную ошибку, а в секции catch предлагает на замену создать свою. Никакую коллекцию штатно не получить.

begin try
	raiserror('PRINT:try section', 10, 1)
	raiserror('ERROR:try section', 16, 1)
end try
begin catch
	raiserror('ERROR:catch section', 16, 1)
end catch

Хотя, может чего не знаю, а кто-то из коллег сможет просветить?
14 фев 12, 12:39    [12087729]     Ответить | Цитировать Сообщить модератору
 Re: error_message() содержит только последнюю часть ошибки  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Andret,

несложно проверить:

restore headeronly from disk = 'c:\nofile.bak'
go

begin try
restore headeronly from disk = 'c:\nofile.bak'
end try
begin catch
declare @s varchar(max)
set @s = error_message()
raiserror( 'Catched message: %s', 16, 1, @s )
end catch
go


первый батч мы получаем то, что получит клиент, то есть коллекцию из 2 сообщений, из которых первое - смысловое
и тут все хорошо
а вот по тому, что поймает catch на сервер-сайде никаких выводов уже сделать нельзя, просто "все сломалось"
14 фев 12, 13:55    [12088466]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить