TSQL - Возвращает значение из sp, когда sp не содержит return - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть хранимая процедура, которая вызывается другой хранимой процедурой

ALTER PROCEDURE [dbo].[usp_Test] 
AS
begin
declare @errorCode int
declare @lastIdentity int
select @errorCode = @@ERROR
    if @errorCode=0
    begin
        update Vehicle  set model='1996----------'
            where Make='MERC'
        select @errorCode = @@ERROR
        select @lastIdentity = @@IDENTITY
    end 

print 'usp_test lastIdentity='  + convert(varchar(10), isnull(@lastIdentity,0)) 
print 'usp_test errorCode=' + convert(varchar(10), @errorCode) 

end

Если я вызываю хранимую процедуру следующим образом

declare @RetVal int

exec @RetVal=usp_Test

print 'return value is ' + convert(varchar(10), @RetVal)

Я получаю следующие сообщения

Сообщение 8152, уровень 16, состояние 14, процедура usp_Test, строка 14 Строка или двоичные данные будут обрезаны.Заявление было прекращено.usp_test lastIdentity = 0 usp_test errorCode = 8152 возвращаемое значение равно -6

Путем добавления RETURN 0 в конце и RETURN @errorCode после select @errorCode ... У меня будет хороший чистый способ возврата ошибки ивпоследствии справиться с этим.Я удивлен, что без каких-либо ВОЗВРАТОВ я получаю возвращаемое значение -6.Кто-нибудь может объяснить, почему это так?

Ответы [ 3 ]

5 голосов
/ 18 февраля 2011

скопировано с этого ответа

Если у вас есть оператор RETURN с явное возвращаемое значение, то есть Конечно возвращаемое значение.

Но если нет оператора RETURN, но ошибка возникает во время выполнения, возвращаемое значение составляет 10 минус Уровень серьезности ошибки. разделение на нуле уровень 16, таким образом, возвращение значение -6. Ошибки разрешений типичный уровень 14, таким образом, возвращение значение -4.

Как вы можете догадаться, это не очень полезно, но это: 0 - это успех, а все остальное - ошибка.

0 голосов
/ 18 февраля 2011

Следующая ссылка содержит ответ, который я искал: http://www.sommarskog.se/error-handling-I.html#returnvalue

Это выдержка.«Все хранимые процедуры имеют возвращаемое значение, определяемое оператором RETURN. Оператор RETURN принимает один необязательный аргумент, который должен быть числовым значением. Если вы говорите RETURN без предоставления значения, возвращаемое значение равно 0, если во время ошибки нетВыполнение. Если во время выполнения процедуры возникает ошибка, возвращаемое значение может быть 0 или отрицательным числом. То же самое верно, если в процедуре вообще нет оператора RETURN: возвращаемое значение может быть отрицательнымчисло или оно может быть 0. "

0 голосов
/ 18 февраля 2011

Стандартное возвращаемое значение, когда вы ничего не указали и процедура выполнена правильно - 1.

Когда процедура возвращает ошибку, и вы не указали возвращаемое значение, по умолчанию возвращается 10 - уровень ошибки с максимальным значением 0.

например:

    CREATE PROCEDURE p_error16
    AS 
    RAISERROR('error', 16, 1)
    GO

вернет -6, а следующий процесс вернет -7:

    CREATE PROCEDURE p_error17
    AS 
    RAISERROR('error', 17, 1)
    GO

если уровень ошибки становится меньше 10, возвращаемое значение равно 0:

    CREATE PROCEDURE p_error5
    AS 
    RAISERROR('error', 5, 1)
    GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...