Подтвердить что ты не робот

Возвращаемое значение из хранимой процедуры proc при ошибке

У меня есть 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, который ничего не возвращает, то есть он не имеет в нем никаких операторов выбора, и вы делаете:

declare @RetVal int  
EXEC @RetVal = yourSPName  

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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


EDIT: встречный пример

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. В разделе "Язык управления потоком" RETURN "он нашел

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

Ответ 3

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

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

Что-то, что я нашел, было из этой ссылки 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-handling-I.html

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

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

Ответ 4

Например

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 по существу скрывает ошибку глубже в стеке вызовов.

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

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

Ответ 5

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