Posso ativar o modo SQLCMD de dentro de um script?

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.

Gravidades 20-24 :

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

  • Para ssms, as 2 primeiras linhas seriam suficientes e para o SQL 2000 Query Analyzer funciona, mas a mensagem não é exibida.
  • Mas não ' o o script continua em execução a partir do próximo GO?
  • Conforme mencionado aqui , você também pode definir SET NOEXEC ON como uma medida de segurança adicional para evitar que qualquer outra coisa no script seja executada.
  • @Dan Nolan: Entendo, de alguma forma eu perdi o ponto da 3ª linha. Então, se bem entendi, ' s nenhuma solução para desligar o modo SQLCMD. Essencialmente, ele exibirá incorrect syntax near ':' por causa de :setvar no início …
  • @youcantryreachingme 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 o SET NOEXEC ON) é executado. A razão pela qual as NOEXEC instruções existem é para cobrir a situação em que o usuário em execução não tem sysadmin / ALTER TRACE privilégios, que são necessários para gerar erros fatais.

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *