Вопрос о RAISERROR()

Pavel_yu
Дата: 13.09.2006 16:44:23
Я хочу в хранимой процедуре сделать обработку ошибки своей. Примерно так:

IF <условие>
....
RAISERROR('Сообщение',16,1)
Return (-2)

И как мне на клиенте получить -2, которая в RETURN'e стоит. На клиенте я получаю только номер ошибки 50000 и сообщение. А можно как-то сделать номер для своей ошибки, не добавляя ничего в sysmessage
Glory
Дата: 13.09.2006 16:46:41
И как мне на клиенте получить -2, которая в RETURN'e стоит.
А как вы его получали всегда ?
RENaissance
Дата: 13.09.2006 16:47:23

Pavel_yu

И как мне на клиенте получить -2, которая в RETURN'e стоит.

Это значение получается на клиенте через выходной параметр.


Posted via ActualForum NNTP Server 1.3

GreenSunrise
Дата: 13.09.2006 16:49:38
Убрать raiserror и возвращать значение через return, как и написано у вас. А можно через выходной параметр.
Zlato
Дата: 13.09.2006 16:49:49
Не знаю на чем пищете но в дельфе, у любой ХП первый параметр @RETURN_VALUE именно туда и попадает -2
Nik V. Polonski
Дата: 13.09.2006 17:00:47
Pavel_yu
Я хочу в хранимой процедуре сделать обработку ошибки своей. Примерно так:

IF <условие>
....
RAISERROR('Сообщение',16,1)
Return (-2)

И как мне на клиенте получить -2, которая в RETURN'e стоит. На клиенте я получаю только номер ошибки 50000 и сообщение. А можно как-то сделать номер для своей ошибки, не добавляя ничего в sysmessage

Мы свой код зашивали в сообщение:
CREATE procedure sys_RaisError
-- вызов raiserror с сообщением из Message
@MsgID int,
@p1 sql_variant = null,
@p2 sql_variant = null,
@p3 sql_variant = null,
@p4 sql_variant = null
as
set nocount on
declare @c1 varchar(200)
declare @c2 varchar(200)
declare @c3 varchar(200)
declare @c4 varchar(200)
declare @severity smallint, @msg nvarchar(255)
set @c1 = convert( varchar, @p1 )
set @c2 = convert( varchar, @p2 )
set @c3 = convert( varchar, @p3 )
set @c4 = convert( varchar, @p4 )
select @severity = severity, @msg = '#' + cast(ID as varchar) + '#' + description from dbo.Message where ID = @MsgID
raiserror(  @msg, @severity, 1, @c1, @c2, @c3, @c4 )
GO

BootMaker
Дата: 13.09.2006 17:10:15
Зачем?
Ведь возвращаемое значение - это одно, а @@error - совсем другое.

create procedure p
as
raiserror('!',16,1)
return (-2)
go
declare @ret int
exec @ret = p
select @ret,@@error
Pavel_yu
Дата: 13.09.2006 19:07:03
to Zlato

Не знаю на чем пищете но в дельфе, у любой ХП первый параметр @RETURN_VALUE именно туда и попадает -2


Я пишу Visual Foxpro 8.0. Там ХП вызывается с помощью функции SQLEXEC() и как все функии FoxPRo она возвращает одно значение (это значение можно запомнить в переменную nSQL=SQLEXEC() ) но это значение равно именно 50000, т.е. код пользовательской ошибки. Дополнительные параметры можно получить с помощью функции AERROR(@lAer) с парметром массива (@ означает в Fox передачу по ссылке, так там все массивы передаются), в этом массиве содержится и сообщение, и номер ошибки, и какое-то состяние сервера, но -2(которое в RETURN'e) там нет.

Возможно тут пригодилась бы больше помощь фоксистов
Pavel_yu
Дата: 14.09.2006 13:47:11
Спасибо всем за помощь!

После долгих экспериментов выяснил, что если происходит ошибка в хранимой процедуре на сервере (и RAISERROR() тоже считается ошибкой) то уже ничего получить нельзя на клиенте даже Record Set, только номер ошибки и сообщение.

Решил действовть через выходные параметры OUT и Raiserror() не использовать, тогда на клиенте после выполнения придется выполнять две проверки: одна на ошибку сервера(которая всегда может быть) и вторая на мою ошибку.

А все-таки можно ли при ошибке на сервере как-то вернуть или значение Return или значение параметра OUT? Может есть какие-то установки на MS Server?