¿Puedo habilitar el modo SQLCMD desde dentro de un script?

¿Hay algo como una directiva que pueda usar en un script para forzar a SSMS a habilitar / deshabilitar el modo SQLCMD?

Responder

Como se ha dicho, no hay forma.

Sin embargo, una cosa hacer es incluir una comprobación rápida en el encabezado de nuestro script, para determinar si el modo SQLCMD está activado (y terminar el script si no lo está):

:setvar DatabaseName "MyDatabase" GO IF ("$(DatabaseName)" = "$" + "(DatabaseName)") RAISERROR ("This script must be run in SQLCMD mode. Disconnecting.", 20, 1) WITH LOG GO -- The below is only run if SQLCMD is on, or the user lacks permission to raise fatal errors IF @@ERROR != 0 SET NOEXEC ON GO PRINT "You will only see this when SQLCMD mode is on" -- Rest of script goes here GO SET NOEXEC OFF GO 

Hay un razón por la que se usa la gravedad 20, tiende a interrumpir la conexión inmediatamente, evitando que se ejecute más código de secuencia de comandos, incluso si hay GO terminadores de lote más adelante en la secuencia de comandos.

Gravedades 20-24 :

Indican problemas del sistema y son errores fatales, lo que significa que la tarea del Motor de base de datos que está ejecutando una instrucción o un lote ya no se está ejecutando. La tarea registra información sobre lo que ocurrió y luego termina. En la mayoría de los casos, la conexión de la aplicación a la instancia del motor de base de datos también puede terminar . Si esto sucede, dependiendo del problema em, es posible que la aplicación no pueda volver a conectarse.

Los mensajes de error en este rango pueden afectar a todos los procesos que acceden a los datos en la misma base de datos y pueden indicar que una base de datos u objeto está dañado. Los mensajes de error con un nivel de gravedad del 19 al 24 se escriben en el registro de errores.

Comentarios

  • Para ssms las primeras 2 líneas serían suficientes y para SQL 2000 Query Analyzer funciona, pero el mensaje no se muestra.
  • Pero no ' t el el script simplemente continúa ejecutándose desde el siguiente GO?
  • Como se mencionó aquí , también puede configurar SET NOEXEC ON como una medida de seguridad adicional para evitar que se ejecute cualquier otra cosa en el script.
  • @Dan Nolan: Ya veo, de alguna manera me perdí el punto de la tercera línea. Entonces, si lo entiendo correctamente, ' no hay solución para cubrir el modo SQLCMD desactivado. Básicamente, mostrará incorrect syntax near ':' debido a :setvar al principio …
  • @youcantryreachingme RAISERROR nivel de severidad 20 (y superior) es considerado por SQL como un error fatal, lo que da como resultado que la conexión se caiga inmediatamente, por lo tanto, no más lotes (ni siquiera SET NOEXEC ON) se ejecuta. La razón por la que las NOEXEC están ahí es para cubrir la situación en la que el usuario que ejecuta no tiene sysadmin / ALTER TRACE privilegios, que son necesarios para generar errores fatales.

Respuesta

No.

Pero siempre puede ejecutar en modo SQLCMD y tener T-SQL en él

Para hacer una distinción clara entre los comandos SQLCMD y Transact-SQL, todos los comandos SQLCMD deben tener un prefijo de dos puntos (:).

Comentarios

  • ¿Sigue siendo válido para SQL Server 2012/2014/2016?
  • @ hot2use: Sí, yo ' lo usé en 2014/2016

Deja una respuesta

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