Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 raiserror, @@error, @return_value  [new]
boogier
Member

Откуда: Н.Новгород
Сообщений: 220
Microsoft SQL Server 2005 - 9.00.4035.00 (X64) Nov 24 2008 16:17:31 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

create proc #sp1
as

raiserror('err1', 16, 1)
raiserror('err2', 15, 1)

go

declare @return_value int

exec @return_value = #sp1

select @return_value [@return_value], @@error [@@error]

go

drop proc #sp1

результат:
Msg 50000, Level 16, State 1, Procedure #sp1____________________________________________________________________________________________________________________0012D4E3, Line 4
err1
Msg 50000, Level 15, State 1, Procedure #sp1____________________________________________________________________________________________________________________0012D4E3, Line 5
err2
@return_value @@error
------------- -----------
-6 50000

@return_value получается равным - (макс. Severity всех ошибок в процедуре - 10)
Это где-то документировано?
17 июн 09, 17:14    [7311899]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
boogier
Member

Откуда: Н.Новгород
Сообщений: 220
Еще фича:
create proc #sp1
as

raiserror('err1', 16, 1)

return

go

exec #sp1

select @@error [@@error]

go

drop proc #sp1

в сравнении с
create proc #sp1
as

raiserror('err1', 16, 1)

return 0

go

exec #sp1

select @@error [@@error]

go

drop proc #sp1

результаты:

первый:
Msg 50000, Level 16, State 1, Procedure #sp1____________________________________________________________________________________________________________________0012D4E3, Line 4
err1
@@error
-----------
50000

второй:
Msg 50000, Level 16, State 1, Procedure #sp1____________________________________________________________________________________________________________________0012D4E3, Line 4
err1
@@error
-----------
0

return не сбрасывает @@error
return N - сбрасывает
как-то это не хорошо :(
17 июн 09, 17:19    [7311934]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
RAISERROR (Transact-SQL)
Если аргумент msg_str определен, инструкция RAISERROR создает сообщение об ошибке с номером ошибки 50000

http://msdn.microsoft.com/ru-ru/library/ms178592.aspx
17 июн 09, 17:30    [7312021]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
@@ERROR (Transact-SQL)
Поскольку функция @@ERROR очищается и сбрасывается для каждой выполняемой инструкции, проверяйте ее сразу после инструкции или сохраните значение в локальную переменную для последующей проверки.

http://msdn.microsoft.com/ru-ru/library/ms188790.aspx

return N отрабатывает без ошибок, не так ли?
17 июн 09, 17:33    [7312047]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
boogier
Member

Откуда: Н.Новгород
Сообщений: 220
iap
RAISERROR (Transact-SQL)
Если аргумент msg_str определен, инструкция RAISERROR создает сообщение об ошибке с номером ошибки 50000

http://msdn.microsoft.com/ru-ru/library/ms178592.aspx

вопрос-то собственно про @return_value
разве я нечетко сформулировал?
17 июн 09, 18:10    [7312329]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
boogier
Member

Откуда: Н.Новгород
Сообщений: 220
iap
@@ERROR (Transact-SQL)
Поскольку функция @@ERROR очищается и сбрасывается для каждой выполняемой инструкции, проверяйте ее сразу после инструкции или сохраните значение в локальную переменную для последующей проверки.

http://msdn.microsoft.com/ru-ru/library/ms188790.aspx

return N отрабатывает без ошибок, не так ли?

return тоже отрабатывает без ошибок :)
17 июн 09, 18:11    [7312336]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
boogier
iap
@@ERROR (Transact-SQL)
Поскольку функция @@ERROR очищается и сбрасывается для каждой выполняемой инструкции, проверяйте ее сразу после инструкции или сохраните значение в локальную переменную для последующей проверки.

http://msdn.microsoft.com/ru-ru/library/ms188790.aspx

return N отрабатывает без ошибок, не так ли?

return тоже отрабатывает без ошибок :)
При этом просто передаёт управление за пределы процедуры.
А return 0 ещё и успешно присваивает значение выходной переменной.
17 июн 09, 19:11    [7312575]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
boogier
Member

Откуда: Н.Новгород
Сообщений: 220
iap
При этом просто передаёт управление за пределы процедуры.
А return 0 ещё и успешно присваивает значение выходной переменной.


всё это фантазии. Так как это, видимо, таки недокументировано, то Микрософт может либо навсегда оставить как сейчас либо исправить в ту или иную сторону (как им покажется логичнее).
В нашей системе многие процедуры имеют конструкцию raiserror return и есть опасения, что в какой-то момент это перестанет работать.

зы: кто-нибудь может проверить как отрабатывают эти примеры на sql 2008?
18 июн 09, 09:17    [7313780]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
boogier
iap
При этом просто передаёт управление за пределы процедуры.
А return 0 ещё и успешно присваивает значение выходной переменной.


всё это фантазии. Так как это, видимо, таки недокументировано, то Микрософт может либо навсегда оставить как сейчас либо исправить в ту или иную сторону (как им покажется логичнее).
В нашей системе многие процедуры имеют конструкцию raiserror return и есть опасения, что в какой-то момент это перестанет работать.

зы: кто-нибудь может проверить как отрабатывают эти примеры на sql 2008?
А по-моему, это Вы фантазируете.
Возвращаемое значение процедуры специально придумано для возврата кода ошибки.
что мешает написать в процудуре
RETURN @@ERROR
? Это будет работать всегда.
Кому вообще пришло в голову проверять @@ERROR после вызова процедуры?
18 июн 09, 09:25    [7313797]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
boogier
зы: кто-нибудь может проверить как отрабатывают эти примеры на sql 2008?
В 2008-ом работает так же, как Вы написали.
18 июн 09, 09:27    [7313806]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
boogier
Member

Откуда: Н.Новгород
Сообщений: 220
iap

что мешает написать в процудуре
RETURN @@ERROR
? Это будет работать всегда.

то, что уже сотни процедур написаны
iap

Кому вообще пришло в голову проверять @@ERROR после вызова процедуры?

а где-то написано, что так нельзя?
18 июн 09, 17:52    [7317206]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
boogier
а где-то написано, что так нельзя?
Да ради бога!
Но Вы же не уверены в том, чему равно @@ERROR после процедуры
(если, конечно, не лезть в каждую процедуру разбираться)?
Какой же тогда в этом смысл?
18 июн 09, 20:08    [7317716]     Ответить | Цитировать Сообщить модератору
 Re: raiserror, @@error, @return_value  [new]
boogier
Member

Откуда: Н.Новгород
Сообщений: 220
Смысл моего вопроса не в том, чтобы решить уже решенную задачу (еще для sql 2000) другим способом, а в том, чтобы по возможности выяснить:
1. это баг или фича?
2. если будут фиксить, то
- оставят как есть и документируют
- изменят алгоритм работы в ту или иную сторону
3. забьют и не дадут никаких гарантий на поведение данных скриптов в будущем

вероятно таки будет "3".
19 июн 09, 10:40    [7319259]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить