Posso abilitare la modalità SQLCMD dall'interno di uno script?


17

Esiste qualcosa come una direttiva che posso usare in uno script per forzare SSMS ad abilitare / disabilitare la modalità SQLCMD?

Risposte:


17

Come è stato detto, non c'è modo.

Tuttavia, una cosa che facciamo è includere un controllo rapido nell'intestazione dello script, per determinare se la modalità SQLCMD è attiva (e in caso contrario terminare lo script):

: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

C'è un motivo per cui viene utilizzata Severity 20, tende a GOinterrompere immediatamente la connessione, impedendo l'esecuzione di altro codice di script, anche se ci sono terminatori batch più avanti nello script.

Gravità 20-24 :

Indica i problemi di sistema e sono errori irreversibili, il che significa che l'attività del Motore di database che esegue un'istruzione o un batch non è più in esecuzione. L'attività registra le informazioni su ciò che è accaduto e quindi termina. Nella maggior parte dei casi, può anche terminare la connessione dell'applicazione all'istanza del Motore di database . In questo caso, a seconda del problema, l'applicazione potrebbe non essere in grado di riconnettersi.

I messaggi di errore in questo intervallo possono influire su tutti i processi che accedono ai dati nello stesso database e possono indicare che un database o un oggetto è danneggiato. I messaggi di errore con un livello di gravità compreso tra 19 e 24 vengono scritti nel registro errori.


Per ssms le prime 2 righe sarebbero sufficienti e per sql 2000 Query Analyzer funziona, ma il messaggio non viene visualizzato.
bernd_k,

Ma la sceneggiatura non continuerebbe a essere eseguita dal prossimo GO?
Dan Nolan,

Sto usando SSMS 2008 R2 e lì vengono prodotte le 2 righe: Meldung 102, Ebene 15, Status 1, Zeile 1 Sintassi errata vicino a ':'. Utilizzando SQL Server 2000 Query Analyzer è necessario utilizzare RAISERROR.
bernd_k,

4
Come menzionato qui , puoi anche impostare SET NOEXEC ONcome misura di sicurezza aggiuntiva per impedire l'esecuzione di qualsiasi altra cosa nello script.
Yahoo Serious

Hmm, sta usando la modalità SQLCMD per scoprire se la modalità SQLCMD è attiva ... Direi che non funzionerà correttamente quando la modalità SQLCMD è disattivata, come sperimentato da @bernd_k. Tuttavia, se: setvar viene rimosso / sostituito per SQL, funzionerà.
Oak_3260548,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.