Posso ativar o modo SQLCMD de dentro de um script?

17

Existe algo como uma diretiva que eu possa usar em um script para forçar o SSMS a ativar / desativar o modo SQLCMD?

bernd_k
fonte

Respostas:

17

Como já foi dito, não há como.

No entanto, uma coisa que fazemos é incluir uma verificação rápida no cabeçalho do 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 not see this unless SQLCMD mode is on'
-- Rest of script goes here

GO
SET NOEXEC OFF
GO

Há um motivo pelo qual a Gravidade 20 é usada, ela tende a GOinterromper a conexão imediatamente, impedindo a execução de mais código de script, mesmo se houver terminadores em lote posteriormente no script.

Gravidades 20-24 :

Indique problemas no 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 depois termina. Na maioria dos casos, a conexão do aplicativo com a instância do Mecanismo de Banco de Dados também pode terminar . Se isso acontecer, dependendo do problema, talvez o aplicativo não consiga se reconectar.

As mensagens de erro nesse 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 nível de gravidade de 19 a 24 são gravadas no log de erros.

Dan Nolan
fonte
Para ssms, as duas primeiras linhas seriam suficientes e, para o sql 2000 Query Analyzer, ele funciona, mas a mensagem não é exibida.
bernd_k
Mas o script não continuaria sendo executado a partir do próximo GO?
Dan Nolan
Estou usando o SSMS 2008 R2 e as duas linhas produzem: Meldung 102, Ebene 15, Status 1, Zeile 1 Sintaxe incorreta perto de ':'. Usando o SQL Server 2000 Query Analyzer, você precisa usar o RAISERROR.
bernd_k
4
Conforme mencionado aqui , você também pode definir SET NOEXEC ONcomo uma medida de segurança adicional para impedir a execução de qualquer outra coisa no script.
Yahoo Serious
Hmm, isso está usando o modo SQLCMD para descobrir se o modo SQLCMD está ativado ... Eu diria que não funcionará corretamente quando o modo SQLCMD estiver desativado, como o @bernd_k experimentou. No entanto, se: setvar for removido / substituído pelo SQL, ele funcionará.
Oak_3260548 26/06
7

Não.

Mas você sempre pode executar no modo SQLCMD e ter o T-SQL nele

Para fazer uma distinção clara entre comandos SQLCMD e Transact-SQL, todos os comandos SQLCMD precisam ser prefixados com dois pontos (:).

gbn
fonte
Isso ainda é válido para o SQL Server 2012/2014/2016?
John aka hot2use
1
@ hot2use: Sim, eu o usei em 2014/2016
gbn