Existe algo como uma diretiva que eu possa usar em um script para forçar o SSMS a ativar / desativar o modo SQLCMD?
Resposta
Como já foi dito, não existe uma maneira.
No entanto, uma coisa nós fazer é incluir uma verificação rápida no cabeçalho do nosso script, para determinar se o modo SQLCMD está ativado (e encerrar o script se não estiver):
: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
Há um Se a Severidade 20 for usada, ela tende a encerrar a conexão imediatamente, impedindo a execução de mais códigos de script, mesmo se houver GO
terminadores de lote posteriormente no script.
Indica problemas do sistema e são erros fatais, o que significa que a tarefa do Mecanismo de Banco de Dados que está executando uma instrução ou lote não está mais em execução. A tarefa registra informações sobre o que ocorreu e termina. Na maioria dos casos, a conexão do aplicativo a instância do Mecanismo de Banco de Dados também pode encerrar . Se isso acontecer, dependendo do problema em, o aplicativo pode não conseguir se reconectar.
Mensagens de erro neste intervalo podem afetar todos os processos que acessam dados no mesmo banco de dados e podem indicar que um banco de dados ou objeto está danificado. Mensagens de erro com um nível de gravidade de 19 a 24 são gravadas no log de erros.
Comentários
Resposta
Não
Mas você sempre pode executar no modo SQLCMD e ter T-SQL nele
Para fazer uma distinção clara entre os comandos SQLCMD e Transact-SQL, todos os comandos SQLCMD precisam ser prefixados com dois pontos (:).
Comentários
- Isso ainda é válido para SQL Server 2012/2014/2016?
- @ hot2use: Sim, eu ' usei em 2014/2016
SET NOEXEC ON
como uma medida de segurança adicional para evitar que qualquer outra coisa no script seja executada.incorrect syntax near ':'
por causa de:setvar
no início …RAISERROR
nível de gravidade 20 (e acima) é considerado pelo SQL como um erro fatal, que resulta na conexão sendo interrompida imediatamente, portanto, nenhum lote adicional (nem mesmo oSET NOEXEC ON
) é executado. A razão pela qual asNOEXEC
instruções existem é para cobrir a situação em que o usuário em execução não temsysadmin
/ALTER TRACE
privilégios, que são necessários para gerar erros fatais.