Возвращаемое значение из сохраненного процесса при ошибке - PullRequest
23 голосов
/ 24 июня 2009

У меня есть sp в SQL Server, который при ошибках возвращает -4

Что означает -4? Есть ли где-нибудь таблица, поясняющая возможные возвращаемые значения?


Должен быть какой-то стандарт

Например

declare @RetVal int  
EXEC @RetVal = stpTest  
select @RetVal

где stpTest "SELECT 1/0" возвращает -6.

-6 должно что-то значить!


В sp, который возвратил -4, есть только инструкции UPDATE и SELECT INTO.

Ни в коем случае он не делает «SELECT -4», так как я могу «узнать, что означает -4 в этой конкретной хранимой процедуре»?

Кроме того, если нет стандарта, тогда почему ошибка деления на ноль всегда возвращает -6?


Если у вас есть sp, который ничего не возвращает, то есть в нем нет операторов select, и вы делаете:

declare @RetVal int  
EXEC @RetVal = yourSPName  

Тогда @RetVal будет иметь значение 0.

Если есть ошибка, тогда @RetVal будет значением, отличным от нуля, например, если ваш sp выполняет только «SELECT 1/0», тогда @RetVal будет -6.

Попробуйте и посмотрите

Мой вопрос: что означают эти возвращаемые значения? Они должны иметь какое-то логическое значение!

Ответы [ 5 ]

28 голосов
/ 24 июня 2009

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

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

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

10 голосов
/ 24 июня 2009

Стандартов для кодов возврата не существует. Вам нужно выяснить, что означает -4 в этой конкретной хранимой процедуре. На самом деле не все коды возврата являются ошибками.


РЕДАКТИРОВАТЬ: контрпример

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[RetValTest] 
AS
BEGIN
    select 1/0;
END

GO

Исполнение:

DECLARE @return_value int

EXEC    @return_value = [dbo].[RetValTest]

SELECT  'Return Value' = @return_value

GO

Результат:

Msg 8134, Level 16, State 1, Procedure RetValTest, Line 9
Divide by zero error encountered.

Это с SQL Server 2008.


Некоторые исследования показывают, что это поведение может быть перенесено из SQL Server 6.0. Если это так, то вы сами можете решить, насколько надежным он будет, учитывая, что они перестали это документировать (и перестали гарантировать его точность) так давно.


Мое "исследование" связано с благодарностью SQL Server MVP Тибор Караси . Его источником является Books Online для SQL Server 6.5. В разделе «« Язык управления потоком », ВОЗВРАТ» он обнаружил

«SQL Server резервирует 0, чтобы указать успешное возвращение и резервирует отрицательные значения от - 1 до - 99, чтобы указать разные причины неудачи. Если пользовательское возвращаемое значение отсутствует при условии, что используется значение SQL Server. Пользовательский статус возврата значения не должны конфликтовать с зарезервированными SQL Server. в настоящее время используются значения от 0 до -14.
3 голосов
/ 06 ноября 2012

Например

declare @RetVal int  
EXEC @RetVal = stpTest  
select @RetVal

, где stpTest равно SELECT 1/0, возвращает -6.

-6 должно что-то значить!

Если у вас есть sp, который ничего не возвращает, т.е. он не имеет любые выбранные утверждения в нем, и вы делаете:

declare @RetVal int  
EXEC @RetVal = yourSPName  

Тогда @RetVal будет иметь значение 0.

Если есть ошибка, тогда @RetVal будет значением, отличным от нуля, например, если ваш sp делает только SELECT 1/0, тогда @RetVal будет -6.

Попробуйте и посмотрите


Прежде всего, спасибо, что потрудились создать пример, который возвращает -6.

Вот , о чем говорится в документации -6 :

-6 Произошла другая пользовательская ошибка.

-6 может быть наиболее аморфным кодом, который возвращает SQL Server.
Зачем? Поскольку код ошибки -6, по сути, скрывает ошибку глубже в стеке вызовов.

После устранения этой ошибки самостоятельно, вот мои советы по устранению этой ошибки:

  1. Если ваш DAL или прикладной уровень генерирует эту ошибку, запустите код SQL в SQL Server Management Studio как пользователь приложения, не с вашим собственным идентификатором SQL Server. [Почему ? Потому что ваши разрешения могут не совпадать.]
  2. Сделать проверяемый код SQL максимально читабельным. [Зачем? Потому что эта ошибка может скрываться глубоко в стеке вызовов.]
  3. В противном случае закомментируйте половину кода. Ошибка все еще происходит? Закомментируйте 50% оставшегося кода. Промыть и повторить.
3 голосов
/ 24 июня 2009

Я думаю, что вопрос должен быть отредактирован, чтобы спросить -

Каковы возвращаемые значения по умолчанию, если у вас нет оператора RETURN в ваш сохраненный процесс?

Что-то, что я нашел, было по этой ссылке www.redware.com / handbooks / sql_server_handbook / sql_server_stored_procedures.html

SQL Server будет возвращать по умолчанию значение до нуля. Возвращаемые значения обычно используется для возврата флага статуса из хранимой процедуры с ненулевое значение, обычно указывающее сбой во время обработки.

Возвращенные значения трудно доступ с использованием ODBC их использование рекомендуется только вернуть успех или сбой хранимой процедуры при общении с другими хранится процедур.

По этой ссылке - sqlserverpedia.com / wiki / Stored_Procedures _-_ Output_Parameters _ & _ Return_Values ​​

Возвращаемые значения от -99 до 0: зарезервировано для внутреннего использования SQL Server. Вы можете создать свои собственные параметры которые могут быть переданы обратно в призвание программа.

Также еще одна ссылка (я думаю) от @Erland Sommarskog www.sommarskog.se / error-processing-I.html

Возвращаемые значения из хранимых процедур

Все хранимые процедуры имеют возврат значение, определяемое ВОЗВРАТОМ заявление. Оператор RETURN занимает один необязательный аргумент, который должен быть числовое значение. Если вы говорите, ВОЗВРАТИТЕ без предоставления значения, возврат значение равно 0, если во время ошибки нет выполнение. Если ошибка происходит во время выполнение процедуры, возврат значение может быть 0, или это может быть отрицательное число. То же самое верно, если нет никакого заявления ВОЗВРАЩЕНИЯ вообще в процедура: возвращаемое значение может быть отрицательное число или оно может быть 0.

Имеют ли эти отрицательные числа любой смысл, немного сложно сказать. Раньше было так, что возвращаемые значения от -1 до -99 были зарезервированы для сгенерированных системой возвращаемых значений, и Books Online для более ранних версий SQL Server указанные значения для значения от -1 до -14. Тем не менее, Книги Онлайн для SQL 2000 молчит о любом такие оговорки, и не объясните, что будет означать от -1 до -14.

За некоторым исключением, системные хранимые процедуры, которые Microsoft поставляется с возвратом SQL Server 0, чтобы указать успех, и любой ненулевой значение указывает на сбой.

Получение информации об ошибке

Также, если вам нужно выяснить, в чем заключается ошибка (а не то, что означает -6), вы можете попробовать поместить ваш sql в try catch, т.е.

begin try

    select 1/0 as 'an error'

end try

begin catch

    select ERROR_NUMBER() as 'ERROR_NUMBER', 
           ERROR_SEVERITY() as 'ERROR_SEVERITY',
           ERROR_STATE() as 'ERROR_STATE',
           LEFT(ERROR_PROCEDURE(),50) as 'ERROR_PROCEDURE',
           ERROR_LINE() as 'ERROR_LINE' , 
           LEFT(ERROR_MESSAGE(),40) as 'ERROR_MESSAGE'    
end catch 
0 голосов
/ 24 июня 2009

Я не уверен, что есть способ узнать это, не спрашивая разработчиков SQL Server. Это что-то более низкого уровня, чем ваш хранимый процесс, оценивающий то, что вы отправляете, и генерирующий этот код возврата. Если в вашем коде специально не указано RETURN -4 , возможно, оно исходит от анализатора SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...