salida - SQL Server 2000: ¿cómo salir de un procedimiento almacenado?
procedimiento almacenado sql server select (7)
A menos que especifique una gravedad de 20 o superior, raiserror
no detendrá la ejecución. Vea la documentación de MSDN .
La solución normal es incluir una return
después de cada raiserror
:
if @whoops = 1
begin
raiserror(''Whoops!'', 18, 1)
return -1
end
¿Cómo puedo salir en medio de un procedimiento almacenado?
Tengo un procedimiento almacenado en el que quiero rescatar temprano (al intentar depurarlo). Intenté llamar a RETURN
y RAISERROR
, y el sp sigue en ejecución:
CREATE PROCEDURE dbo.Archive_Session @SessionGUID uniqueidentifier AS
print ''before raiserror''
raiserror(''this is a raised error'', 18, 1)
print ''before return''
return -1
print ''after return''
[snip]
Sé que sigue funcionando porque encuentro un error más abajo. No veo ninguna de mis impresiones . Si comento la mayor parte del procedimiento almacenado:
CREATE PROCEDURE dbo.Archive_Session @SessionGUID uniqueidentifier AS
print ''before raiserror''
raiserror(''this is a raised error'', 18, 1)
print ''before return''
return -1
print ''after return''
/*
[snip]
*/
Entonces no obtengo mi error, y veo los resultados:
before raiserror
Server: Msg 50000, Level 18, State 1, Procedure Archive_Session, Line 5
this is a raised error
before return
Entonces la pregunta es: ¿cómo salgo de un procedimiento almacenado en SQL Server?
Es porque no tiene instrucciones BEGIN
y END
. No debería ver las impresiones o los errores que ejecutan esta instrucción, solo la Statement Completed
(o algo así).
Esto funciona aquí.
ALTER PROCEDURE dbo.Archive_Session
@SessionGUID int
AS
BEGIN
SET NOCOUNT ON
PRINT ''before raiserror''
RAISERROR(''this is a raised error'', 18, 1)
IF @@Error != 0
RETURN
PRINT ''before return''
RETURN -1
PRINT ''after return''
END
go
EXECUTE dbo.Archive_Session @SessionGUID = 1
Devoluciones
before raiserror
Msg 50000, Level 18, State 1, Procedure Archive_Session, Line 7
this is a raised error
Esto parece un montón de código, pero la mejor manera que he encontrado para hacerlo.
ALTER PROCEDURE Procedure
AS
BEGIN TRY
EXEC AnotherProcedure
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
RETURN --this forces it out
END CATCH
--Stuff here that you do not want to execute if the above failed.
END --end procedure
Ponlo en un TRY/CATCH
.
Cuando RAISERROR se ejecuta con una gravedad de 11 o superior en un bloque TRY, transfiere el control al bloque CATCH asociado
Referencia: MSDN .
EDITAR: Esto funciona para MSSQL 2005+, pero veo que ahora ha aclarado que está trabajando en MSSQL 2000. Lo dejaré aquí como referencia.
Puede usar RETURN
para detener la ejecución de un procedimiento almacenado inmediatamente. Cita tomada de Books Online :
Sale incondicionalmente de una consulta o procedimiento. RETORNO es inmediato y completo y puede utilizarse en cualquier punto para salir de un procedimiento, lote o bloque de instrucción. Las declaraciones que siguen a RETORNO no se ejecutan.
Fuera de la paranoia, probé su ejemplo y muestra las IMPRESIONES y detiene la ejecución de inmediato.
descubrí por qué RETURN
no regresa incondicionalmente del procedimiento almacenado. El error que estoy viendo es mientras se está compilando el procedimiento almacenado, no cuando se está ejecutando.
Considere un procedimiento almacenado imaginario:
CREATE PROCEDURE dbo.foo AS
INSERT INTO ExistingTable
EXECUTE LinkedServer.Database.dbo.SomeProcedure
Aunque este procedimiento stord contiene un error (tal vez es porque los objetos tienen un número diferente de columnas, tal vez haya una columna de marca de tiempo en la tabla, tal vez el procedimiento almacenado no exista), aún puede guardarlo . Puede guardarlo porque está haciendo referencia a un servidor vinculado.
Pero cuando realmente ejecuta el procedimiento almacenado, SQL Server lo compila y genera un plan de consulta.
Mi error no está sucediendo en la línea 114, está en la línea 114. SQL Server no puede compilar el procedimiento almacenado, es por eso que está fallando.
Y es por eso que RETURN
no regresa, porque aún no ha comenzado .