¿Puedo habilitar el modo SQLCMD desde un script?


17

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

Respuestas:


17

Como se ha dicho, no hay manera.

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

: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 not see this unless SQLCMD mode is on'
-- Rest of script goes here

GO
SET NOEXEC OFF
GO

Hay una razón por la que se usa Severity 20, tiende a eliminar la conexión de inmediato, evitando que se ejecute más código de script, incluso si hay GOterminadores por lotes más adelante en el script.

Gravedades 20-24 :

Indica problemas del sistema y son errores fatales, lo que significa que la tarea Motor de base de datos que ejecuta una instrucción o lote ya no se está ejecutando. La tarea registra información sobre lo ocurrido y luego finaliza. 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 finalizar . Si esto sucede, según el problema, 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 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 de 19 a 24 se escriben en el registro de errores.


Para ssms, las primeras 2 líneas serían suficientes y para sql 2000 Query Analyzer funciona, pero el mensaje no se muestra.
bernd_k

¿Pero el script no continuaría ejecutándose desde el próximo GO?
Dan Nolan

Estoy usando SSMS 2008 R2 y allí producen las 2 líneas: Meldung 102, Ebene 15, Estado 1, Zeile 1 Sintaxis incorrecta cerca de ':'. Con el Analizador de consultas de SQL Server 2000, debe usar RAISERROR.
bernd_k

44
Como se mencionó aquí , también puede establecer SET NOEXEC ONuna medida de seguridad adicional para evitar que se ejecute cualquier otra cosa en el script.
Yahoo Serious

Hmm, esto está usando el modo SQLCMD para averiguar si el modo SQLCMD está activado ... Diría que no funcionará correctamente cuando el modo SQLCMD esté desactivado, como experimentó @bernd_k. Sin embargo, si: setvar se elimina / reemplaza para SQL, funcionará.
Oak_3260548

7

No.

Pero siempre se 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 ir precedidos de dos puntos (:).


¿Sigue siendo válido para SQL Server 2012/2014/2016?
John aka hot2use

1
@ hot2use: Sí, lo he usado en 2014/2016
gbn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.