Posso abilitare la modalità SQLCMD dallinterno di uno script?

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

Risposta

Come è stato detto, non cè “modo”.

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

: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 

Cè un motivo per cui viene utilizzato Severity 20, tende a terminare immediatamente la connessione, impedendo lesecuzione di altro codice di script, anche se ci sono GO terminatori batch più avanti nello script.

Gravità 20-24 :

Indica problemi di sistema e sono errori irreversibili, il che significa che lattività del Motore di database che sta eseguendo unistruzione o un batch non è più in esecuzione. Lattività registra le informazioni su ciò che si è verificato e quindi termina. Nella maggior parte dei casi, la connessione dellapplicazione a listanza del Motore di database potrebbe anche terminare . Se ciò accade, a seconda del problema em, lapplicazione potrebbe non essere in grado di riconnettersi.

I messaggi di errore in questo intervallo possono influenzare 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 degli errori.

Commenti

  • Per ssms le prime 2 righe sarebbero sufficienti e per sql 2000 Query Analyzer funziona, ma il messaggio non viene visualizzato.
  • Ma ' continua lesecuzione dal prossimo GO?
  • Come menzionato qui , puoi anche impostare SET NOEXEC ON come misura di sicurezza aggiuntiva per impedire lesecuzione di qualsiasi altra cosa nello script.
  • @Dan Nolan: vedo, in qualche modo ho perso il punto della terza riga. Quindi, se ho capito bene, ' non cè soluzione per disattivare la modalità SQLCMD. Verrà essenzialmente visualizzato incorrect syntax near ':' a causa di :setvar allinizio …
  • @youcantryreachingme RAISERROR il livello di gravità 20 (e superiore) è considerato da SQL un errore irreversibile, che si traduce nellimmediata interruzione della connessione, quindi nessun ulteriore batch (nemmeno SET NOEXEC ON) viene eseguito. Il motivo per cui le NOEXEC sono presenti è per coprire la situazione in cui lutente in esecuzione non ha sysadmin / necessari per generare errori irreversibili.

Risposta

No.

Ma puoi sempre eseguire in modalità SQLCMD e avere T-SQL in esso

Per fare una chiara distinzione tra i comandi SQLCMD e Transact-SQL, tutti i comandi SQLCMD devono essere preceduti da due punti (:).

Commenti

  • È ancora valido per SQL Server 2012/2014/2016?
  • @ hot2use: Sì, io ' lho usato nel 2014/2016

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *