Saltar al contenido

SQL Server: detener o interrumpir la ejecución de un script SQL

Deseamos mostrarte la mejor información que encontramos en internet. Nuestro deseo es que te resulte de ayuda y si quieres compartir algo que nos pueda ayudar a perfeccionar nuestra información puedes hacerlo..

Solución:

El método del aumento de errores

raiserror('Oh no a fatal error', 20, -1) with log

Esto terminará la conexión, deteniendo así la ejecución del resto del script.

Tenga en cuenta que tanto el nivel de gravedad 20 o superior como el WITH LOG son necesarias para que funcione de esta manera.

Esto incluso funciona con declaraciones GO, por ejemplo.

print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'

Te dará la salida:

hi
Msg 2745, Level 16, State 2, Line 1
Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 1
Oh no a fatal error
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.

Observe que ‘ho’ no está impreso.

ADVERTENCIAS:

  • Esto solo funciona si ha iniciado sesión como administrador (función ‘sysadmin’), y también lo deja sin conexión a la base de datos.
  • Si NO ha iniciado sesión como administrador, la llamada RAISEERROR() fallará y el script seguirá ejecutándose.
  • Cuando se invoca con sqlcmd.exe, se informará el código de salida 2745.

Referencia: http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334

El método noexec

Otro método que funciona con sentencias GO es set noexec on. Esto hace que se salte el resto del script. No finaliza la conexión, pero es necesario activar noexec apáguelo de nuevo antes de que se ejecute cualquier comando.

Ejemplo:

print 'hi'
go

print 'Fatal error, script will not continue!'
set noexec on

print 'ho'
go

-- last line of the script
set noexec off -- Turn execution back on; only needed in SSMS, so as to be able 
               -- to run this script again in the same session.

Simplemente use RETURN (funcionará tanto dentro como fuera de un procedimiento almacenado).

Si puede usar el modo SQLCMD, entonces el conjuro

:on error exit

(INCLUYENDO los dos puntos) hará que RAISERROR detenga el script. P.ej,

:on error exit

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SOMETABLE]') AND type in (N'U')) 
    RaisError ('This is not a Valid Instance Database', 15, 10)
GO

print 'Keep Working'

dará salida:

Msg 50000, Level 15, State 10, Line 3
This is not a Valid Instance Database
** An error was encountered during execution of batch. Exiting.

y el lote se detendrá. Si el modo SQLCMD no está activado, obtendrá un error de análisis sobre los dos puntos. Desafortunadamente, no es completamente a prueba de balas, ya que si el script se ejecuta sin estar en modo SQLCMD, ¡SQL Managment Studio supera incluso los errores de tiempo de análisis! Aún así, si los está ejecutando desde la línea de comandos, está bien.

Aquí puedes ver las comentarios y valoraciones de los usuarios

Si conservas alguna desconfianza o disposición de arreglar nuestro post te proponemos añadir una crítica y con deseo lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *