ver salida procedimientos procedimiento parametros hacer guardar ejemplo ejecutar como codigo almacenados almacenado sql-server tsql stored-procedures sql-server-2000 flow-control

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 .