2010-04-05 20 views
8

¿Alguien podría indicar exactamente dónde MSDN dice que cada procedimiento almacenado por el usuario devuelve 0 por defecto si no ocurre ningún error? En otras palabras, podía estar seguro de que el código ejemplo dado a continuación al tratarse de un procedimiento almacenadoMSDN sobre el valor de retorno predeterminado del procedimiento almacenado

IF someStatement 
BEGIN 
    RETURN 1 
END 

siempre debe devolver cero si someStatement es falsa y no se produce ningún error?

Sé que realmente funciona de esta manera, pero no pude encontrar ninguna declaración explícita sobre esto de Microsoft.

Respuesta

7

Parece que alguna vez el valor de retorno puede haber significado algo (ver referencia de pre SQL 2000 BOL return value article) antes de SQL Server 2000. He revisado para ver si podía encontrar una lista de estas declaraciones originales códigos específicamente para MS SQL, y encontró el following (aunque no sé su autenticidad, y en realidad no enumera los valores).

Entonces, después de leer todos estos artículos, parece que @return_status es un parámetro SIEMPRE devuelto cuando se ejecuta un procedimiento almacenado (incluso si no lo usa). De acuerdo con el artículo RETURN Libros en línea, el código de retorno NO PUEDE ser nulo.

Cuando se utiliza con un procedimiento almacenado, RETORNO no puede devolver un valor nulo. Si un procedimiento intenta devolver un valor nulo (por ejemplo, utilizando RETORNO @status cuando @status es NULO), se genera un mensaje de advertencia y se devuelve de 0.

Ejecución de la siguiente T-SQL muestra definitivamente esto,

create Procedure Test 
as 
begin 
DECLARE @RTN integer 
Return @RTN 
END 
GO 

Exec Test 
GO 

Drop Procedure Test 
GO 

recibirá un

The 'Test' procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead. 

Al final parece que la respuesta es porque @return_status no puede ser nulo (siendo 0 cuando no está establecido, o establecido en NULO) ...

En cuanto al erro códigos R mencionadas en la supuesta BOL article para SQL 7.0, creo que ha de ser un antiguo dominio sobre de Sybase ... Sybase 5.0 Manual

Kris

+0

Su enlace SQL 7 se ve bien. Hay copias de BOL salpicadas alrededor del interweb eléctrico que ocasionalmente sale a la superficie aquí, pero en este caso contribuye muy bien. – gbn

0

Si va a cambiar algo de lógica en su cliente, ¿por qué no devolver "0" y hacerlo más explícito?

+3

Por qué volver "0" de forma explícita si se garantiza que ser devueltos? Ese es todo el sentido de mi pregunta: ¿está realmente garantizado (por algún estándar que se exige que SQL Server cumpla, por ejemplo), o este comportamiento es simplemente opcional o, además, hasta cierto punto, incluso ocasional? – Ilya

6

RETURN on MSDN

Editar:

El enlace dice

Cuando se utiliza con un procedimiento almacenado, de devolución no puede devolver un valor nulo. Si un procedimiento intenta devolver un valor nulo (por ejemplo, utilizando RETORNO @status cuando @status es NULO), se genera un mensaje de advertencia y se devuelve de 0.

Se podría decir que no RETURN = RETURN NULL = RETURN 0. Pero no se emite ninguna advertencia porque no ha ejecutado RETURN NULL. Y se espera cero porque es un procedimiento almacenado.

Además, la ejecución procedimiento almacenado permite

EXEC @rtn = uspMyProc @p1... 

Así algo debe ser devuelto porque siempre esperamos un valor, no NULL

he confiado en el cero de ser devuelto durante 12 años, incluso si MSDN no dice. Además de muchos más de nosotros :-)

+0

Ese es todo el truco que veo en este artículo una y otra vez y no puedo encontrar ninguna declaración concreta y precisa sobre el valor de retorno predeterminado del procedimiento almacenado. El único que encontré un poco relevante es el siguiente: "A menos que se indique lo contrario, todos los procedimientos almacenados del sistema devuelven un valor 0. Esto indica éxito y un valor distinto de cero indica falla" Pero esto es sobre procedimientos almacenados del sistema, no de usuario definido. O, tal vez, uno debería considerar que la llamada de usuario sp es una llamada al sistema sp principalmente? Esta versión me parece bastante improbable. – Ilya

+0

Como pude entender, el artículo que apuntó anteriormente incluso no declara que RETORNO sin argumentos da como resultado la devolución del valor cero. Además, todos los ejemplos enumerados allí no contienen ningún caso de mi interés (el primer ejemplo no explica qué se debe devolver realmente, simplemente indicó que la ejecución de sp se terminará y la otra trata con un retorno distinto de cero valores solamente) – Ilya

0
+1

Este artículo no dice nada sobre el valor de retorno predeterminado. Los ejemplos allí usan explícitamente devuelto cero para indicar éxito. – Ilya

+0

es útil para mí porque hay valores predeterminados descritos para diferentes tipos de operación, por ejemplo, si el procedimiento almacenado es exitoso, de manera predeterminada devuelve 0 – Muflix

Cuestiones relacionadas