¿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.
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
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
SET NOEXEC ON
como una medida de seguridad adicional para evitar que se ejecute cualquier otra cosa en el script.incorrect syntax near ':'
debido a:setvar
al principio …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 siquieraSET NOEXEC ON
) se ejecuta. La razón por la que lasNOEXEC
están ahí es para cubrir la situación en la que el usuario que ejecuta no tienesysadmin
/ALTER TRACE
privilegios, que son necesarios para generar errores fatales.