2009-06-23 10 views
22

Tengo un sp en SQL Server que cuando los errores devuelven -4Devuelve el valor de un proceso almacenado en el error

¿Qué significa -4? ¿Hay alguna tabla que explique cuáles son los posibles valores de retorno?


Debe haber alguna norma

Por ejemplo

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

donde se stpTest "SELECT 1/0" retornos -6.

-6 debe significar algo!


La sp que devolvió -4 solo tiene las instrucciones UPDATE y SELECT INTO en ella.

En ningún momento hace 'SELECT -4' entonces, ¿cómo puedo "descubrir qué -4 significa en ese procedimiento almacenado particular"?

Además, si no hay un estándar, ¿por qué un error de división por cero siempre devuelve -6?


Si usted tiene un SP que no devuelve nada es decir, no tiene ningún sentencias de selección en ella y hacer:

declare @RetVal int 
EXEC @RetVal = yourSPName 

Entonces @RetVal tendrá un valor de 0.

Si hay un error, @RetVal será un valor distinto de cero, por ejemplo, si lo único que su sp hace es "SELECT 1/0", entonces @RetVal será -6.

probarlo y ver

Mi pregunta es ¿qué significan estos valores de retorno? ¡Deben tener un significado lógico!

+0

Como se indica repetidamente a continuación, no hay normas. Si tiene el origen del sproc, intente con sus procedimientos de depuración estándar. – Adrien

+0

¿Qué versión de SQL Server estás usando? Edite su pregunta con un ejemplo completo, que muestre el procedimiento almacenado, la ejecución y el resultado. –

Respuesta

8

No hay un estándar para los códigos de retorno. Tendrás que averiguar qué significa -4 en ese procedimiento almacenado en particular. De hecho, no todos los códigos de retorno son errores.


EDIT: contraejemplo

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

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

GO 

Ejecución:

DECLARE @return_value int 

EXEC @return_value = [dbo].[RetValTest] 

SELECT 'Return Value' = @return_value 

GO 

Resultado:

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

Esto es con SQL Server 2008.


Algunas investigaciones sugieren que este comportamiento puede quedar en SQL Server 6.0. Si ese es el caso, entonces puede decidir por sí mismo qué tan confiable es, dado que dejaron de documentarlo (y dejaron de garantizar su precisión) hace tanto tiempo.


mi "investigación" se debe, con gracias, a SQL Server MVP Tibor Karaszi. Su fuente es Books Online para SQL Server 6.5. En "" lenguaje de control de flujo- "RETORNO", encontró

"SQL Server reserves 0 to indicate a successful return and reserves negative values from - 1 through - 99 to indicate different reasons for failure. If no user-defined return value is provided, the SQL Server value is used. User-defined return status values should not conflict with those reserved by SQL Server. The values 0 through -14 are currently in use.
+0

Ah ok, con SQL Server 2005 es un poco diferente. RetValTest da el mismo mensaje de error pero "SELECT 'Return Value' = @return_value" da un -6 –

+0

con sql2005 en la pestaña de mensajes obtienes ese error, en la pestaña de resultados obtienes -6 - mira mi respuesta debajo de –

+0

acaba de ejecutar tu el ejemplo anterior en SQL 2008 y obtuvo un valor de retorno de -6 debajo de la división por error cero. pruebe las siguientes consulta> Resultados Hasta> Resultados al texto y correr de nuevo, el valor de retorno es más evidente entonces ... O usted podría intentar mirar la ficha Resultados como se sugiere en mi comentario anterior. Habiendo dicho todo eso, tal vez diferentes versiones/diferentes entornos podrían causar que veamos respuestas diferentes, lo que aún deja la pregunta original como válida. es decir, ¿de dónde viene -6? –

-1

No estoy seguro de que hay una manera de saber esto sin preguntar a los desarrolladores de SQL Server. Es algo más bajo que el proceso almacenado que evalúa lo que estás enviando y generando ese código de retorno. A menos que haya obtenido específicamente un RETORNO -4 en su código, probablemente provenga del analizador SQL.

3

Creo que la pregunta debe ser editado para preguntar -

What are the default return values if you dont have a RETURN statement in your stored proc?

Algo me encontré fue desde este enlace www.redware.com/handbooks/sql_server_handbook/sql_server_stored_procedures.html

SQL Server will default the return value to zero. The returned values are typically used to return a status flag from the stored procedure with a non-zero value usually indicating failure during processing.

Returned values are difficult to access using ODBC their use is recommended only to return a success or failure of the stored procedure when communicating with other stored procedures.

Desde este enlace - sqlserverpedia.com/wiki/Stored_Procedures_-_Output_Parameters_&_Return_Values

The return values -99 through 0 are reserved for SQL Server internal use. You can create your own parameters that can be passed back to the calling program.

también otro enlace (supongo) de @Erland Sommarskog www.sommarskog.se/error-handling-I.html

Return Values from Stored Procedures

All stored procedures have a return value, determined by the RETURN statement. The RETURN statement takes one optional argument, which should be a numeric value. If you say RETURN without providing a value, the return value is 0 if there is no error during execution. If an error occurs during execution of the procedure, the return value may be 0, or it may be a negative number. The same is true if there is no RETURN statement at all in the procedure: the return value may be a negative number or it may be 0.

Whether these negative numbers have any meaning, is a bit difficult to tell. It used to be the case, that the return values -1 to -99 were reserved for system-generated return values, and Books Online for earlier versions of SQL Server specified meanings for values -1 to -14. However, Books Online for SQL 2000 is silent on any such reservations, and does not explain what -1 to -14 would mean.

With some occasional exception, the system stored procedures that Microsoft ships with SQL Server return 0 to indicate success and any non-zero value indicates failure.

Obtención de información de error

Además, si usted necesita para encontrar lo que es el error (en lugar de lo -6 medios) podría intentar poner su sql en un intento de captura, es decir.

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

@Steve: no, no es la respuesta. ¿Dónde explica esto -6? Es probable que sea basura en un registro como cualquier otra cosa. –

27

Si tiene una declaración RETURN con un valor de retorno explícito, ese es, por supuesto, el valor de retorno.

Pero si no hay instrucción RETURN, pero se produce un error durante la ejecución, el valor de retorno es 10 menos el nivel de gravedad del error. La división por cero es el nivel 16, por lo tanto, el valor de retorno es -6. Los errores de permisos son el nivel típico 14, por lo que el valor de retorno es -4.

Como puede adivinar, esto no es muy útil, pero esto: 0 es éxito y todo lo demás es un error.

3

For example

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

where stpTest is SELECT 1/0 returns -6.

-6 must mean something!

If you have an sp that does not return anything i.e. it doesn't have any select statements in it and you do:

declare @RetVal int 
EXEC @RetVal = yourSPName 

Then @RetVal will have a value of 0.

If there is an error then @RetVal will be a value other then zero, for example if the only thing your sp does is SELECT 1/0 then @RetVal will be -6.

Try it and see


En primer lugar, gracias por tomarse la molestia de elaborar un ejemplo que devuelve -6.

Aquí es what the documentation says about -6:

-6 Miscellaneous user error occurred.

-6 podría ser el código más amorfa que SQL Server rendimientos.
¿Por qué? Porque el código de error -6 esencialmente oculta un error más profundo en la pila de llamadas.

Después de solucionar este error a mí mismo, aquí están mis consejos para solucionar este error:

  1. Si su DAL o capa de aplicación genera este error, a continuación, ejecutar el código SQL en SQL Server Management Studio como el usuario de la aplicación , no con su propia identificación de SQL Server. [¿Por qué? Debido a que sus permisos pueden no ser los mismos.]
  2. Haga que el código SQL bajo inspección sea lo más legible posible. [¿Por qué? Debido a que este error puede ocultarse en el interior de la pila de llamadas.]
  3. Si falla, pronuncie la mitad del código. ¿El error todavía está ocurriendo? Comente el 50% del código restante. Enjuague y repita.
Cuestiones relacionadas