sql-server - stored - procedimientos almacenados sql
MSDN sobre el valor de retorno predeterminado del procedimiento almacenado (4)
Parece que alguna vez el valor de retorno pudo haber significado algo (consulte la referencia del artículo anterior al valor de retorno de SQL 2000 BOL) antes de SQL Server 2000. Revisé para ver si podía encontrar una lista de estos códigos de retorno originales específicamente para MS SQL, y encontró lo siguiente (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 en línea RETURN Books, el código de retorno NO PUEDE ser nulo.
Cuando se usa con un procedimiento almacenado, RETURN no puede devolver un valor nulo. Si un procedimiento intenta devolver un valor nulo (por ejemplo, utilizando RETURN @status cuando @status es NULL), se genera un mensaje de advertencia y se devuelve un valor de 0.
La ejecución de la siguiente T-SQL definitivamente muestra esto,
create Procedure Test
as
begin
DECLARE @RTN integer
Return @RTN
END
GO
Exec Test
GO
Drop Procedure Test
GO
Recibirás
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 NULL) ...
En cuanto a los códigos de error mencionados en el supuesto artículo de BOL para SQL 7.0, mi conjetura sería una vieja retención de Sybase ... Sybase 5.0 Manual
Kris
¿Podría alguien señalar 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, ¿podría estar seguro de que el código de ejemplo que figura a continuación es un procedimiento almacenado?
IF someStatement
BEGIN
RETURN 1
END
siempre debe devolver cero si someStatement es falso 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.
Si va a cambiar algo de lógica en su cliente, ¿por qué no devuelve "0" y lo hace más explícito?
Editar:
El enlace dice
Cuando se usa con un procedimiento almacenado, RETURN no puede devolver un valor nulo. Si un procedimiento intenta devolver un valor nulo (por ejemplo, utilizando RETURN @status cuando @status es NULL), se genera un mensaje de advertencia y se devuelve un valor de 0.
Se podría decir que no RETURN = RETURN NULL = RETURN 0. Pero no se emite ninguna advertencia porque no se ha ejecutado RETURN NULL
. Y se espera cero porque es un procedimiento almacenado.
Además, la ejecución del proceso almacenado permite
EXEC @rtn = uspMyProc @p1...
Entonces algo debe ser devuelto porque siempre esperamos un valor, nunca NULO
Me he basado en que no se devuelve cero durante 12 años, incluso si MSDN no dice nada. Además de muchos más de nosotros :-)
Devolver datos mediante el uso de un código de retorno de libros en línea.