Estoy trabajando en el script sql y tengo el requisito de dejar de continuar el script si no se cumplen algunas condiciones.
Cuando lo busco en Google, descubrí que el RaisError con un nivel de gravedad de 20 lo terminará. Pero por alguna razón no puedo usar esa opción.
Puede proporcionarme cuáles son las posibles alternativas para detener la ejecución del script SQL.
sql-server
sql-server-2005
error-handling
Nuevo desarrollador
fuente
fuente
Respuestas:
De la documentación de RAISERROR (énfasis mío):
Es muy probable que el director al que está ejecutando el script no cumpla con estos criterios.
No hay nada de malo en usar
RAISERROR
; solo estás usando un nivel de severidad que es excesivo. Uso el nivel 16 como valor predeterminado para un error que se genera y la secuencia finalizará. Si desea ser más preciso, puede seguir los niveles dados por el propio Microsoft:Ahora, habiendo dicho todo eso, dependiendo del contexto del guión, el uso
RAISERROR
puede no ser suficiente, ya que no "sale" del guión por sí mismo (usando niveles de gravedad normales).Por ejemplo:
Esto tanto generará un error y devolver un conjunto de resultados.
Para terminar el script de inmediato, prefiero usar
RETURN
(GOTO
generalmente se desaconseja el uso de construcciones de tipo en la mayoría de los círculos de programación donde existen alternativas):O maneje el error usando
TRY/CATCH
, lo que hará que la ejecución salte alCATCH
bloque si la gravedad es 11 o superior:Otro problema es si el script abarca varios lotes
RETURN
, solo saldrá del lote :Para solucionar esto, puede verificar
@@ERROR
al comienzo de cada lote:Editar: como Martin Smith señala correctamente en los comentarios, esto solo funciona para 2 lotes. Para extender a 3 o más lotes, puede colocar en cascada los errores de elevación de esta manera (nota: el
GOTO
método no resuelve este problema ya que la etiqueta de destino debe definirse dentro del lote):O, como él también señala, puede usar el
SQLCMD
método si es apropiado para su entorno.fuente
Puede utilizar la
GOTO
declaración para saltear donde quiera. En otras palabras, se encuentra con un error o alguna otra condición, y puede tener una etiqueta en la parte inferior del script (es decirTheEndOfTheScript:
) y simplemente emitir unagoto TheEndOfTheScript;
declaración.Aquí hay una muestra rápida:
El resultado de esta ejecución será el siguiente:
Como puede ver,
GOTO
se omitió la impresión de las declaraciones tercera y cuarta y saltó directamente a la etiqueta (TheEndOfTheScript
).fuente
La mejor manera es usar SET NOEXEC ON
Puede leer más aquí: Cómo DETENER o ABORTAR o INTERRUMPIR la ejecución de las declaraciones en el lote actual y en los lotes posteriores separados por la Declaración GO en función de alguna condición en el SERVIDOR SQL
fuente
SET NOEXEC ON/OFF
Estoy de acuerdo con el , sin embargo, en los procedimientos almacenados (que contienen un solo bloque) simplemente uso laRETURN
declaración.Advertencias: en un archivo de script, si tiene varias
GO
declaraciones,RETURN
solo saldrá del bloque actual y continuará con el siguiente bloque / lote.Nota:
GOTO
se supone que es una mala práctica de codificación,TRY..CATCH
se recomienda el uso de " ", ya que se introdujo desde SQL Server 2008, seguido deTHROW
2012.fuente