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.