Nelle istruzioni online per lo script che crea il database di esempio TSQLTutorJoins dalle mie colonne precedenti, ti consiglio di utilizzare osql.exe per eseguire lo script dal prompt dei comandi. Per dimostrare perché, sto basando la colonna di questo mese su RAISERROR e un trucco interessante che ho imparato sull’utilizzo del parametro di stato dell’istruzione RAISERROR. Utilizzando un valore speciale per il parametro RAISERROR state, è possibile forzare la terminazione di uno script complesso e impedirne l’esecuzione nel database errato.,
RAISERROR ha tre componenti principali: il testo dell’errore, la gravità e lo stato. Il testo di errore può essere un messaggio hardcoded o parametrizzato o un numero di errore da un messaggio permanente definito dall’utente. Per creare i propri messaggi permanenti, vedere SQL Server Books Online (BOL) su come utilizzare la stored procedure di sistema sp_addmessage.
La gravità ha diversi livelli definiti. Gli errori definiti dallo sviluppatore variano in gravità da 1 a 16, con 16 che è il più comune e il predefinito. Tuttavia, non tutte le gravità funzionano allo stesso modo., La tabella 1 mostra le categorie di gravità, il modo in cui visualizzano i messaggi in Query Analyzer e il modo in cui vengono registrati facoltativamente nel registro dell’applicazione del visualizzatore eventi. Per registrare i messaggi al visualizzatore eventi, è possibile utilizzare WITH LOG nella propria istruzione RAISERROR o creare il messaggio permanente utilizzando sp_addmessage con il parametro with_log impostato su ‘TRUE’. Quest’ultima scelta scriverà ogni occorrenza di questo errore nel registro dell’applicazione del visualizzatore eventi, anche se RAISERROR non specifica CON LOG., La sintassi RAISERROR semplificata è
RAISERROR (error, severity, state) WITH LOG
Ad esempio,
RAISERROR ('Test Severity 16', 16, 1) WITH LOG
restituisce il seguente errore alla finestra messaggi in Query Analyzer:
Error Number InfoServer: Msg 50000, Level 16, State 1, Line 1Error Text Test Severity 16
La prima riga è l’Informazione del numero di errore, come descritto nella Tabella 1. Query Analyzer non visualizza queste informazioni per la gravità 10. Il colore del display cambia da nero per gravità da 1 a 9 a rosso per 11 e superiori. Lo script di esempio nel listato 1 mostra sintassi e idee aggiuntive per l’utilizzo di RAISERROR, incluso l’utilizzo di più lingue e la parametrizzazione., Per ulteriori informazioni sull’utilizzo di RAISERROR e delle varie gravità, vedere BOL nei seguenti argomenti: Messaggi di errore, Livelli di gravità dei messaggi di errore, RAISERROR, Utilizzo di RAISERROR, FORMATMESSAGE e xp_logevent.
Oltre alla gravità, RAISERROR supporta anche uno stato. Molti script di creazione di oggetti creano un database e quindi tabelle, procedure e così via all’interno del database appena creato. Ma cosa succede se lo script non ha creato correttamente il database? Tutti gli oggetti aggiuntivi (ad es.,, tabelle, procedure) verrebbe creato nel database predefinito, che per gli amministratori di sistema potrebbe essere master. La creazione di tutti gli oggetti del database definiti dall’utente nel database master è esattamente ciò che non si desidera, quindi quando si esegue lo scripting di un processo automatizzato, è possibile includere un valore per lo stato che termina lo script se si verifica un errore fatale (secondo la definizione).
Tuttavia, l’impostazione del valore di stato non appare sempre per terminare la sessione. Applicazioni come Query Analyzer potrebbero riconnettersi automaticamente quando una connessione è interrotta., Quindi, per vedere appieno il vantaggio dell’opzione di stato, è necessario utilizzare uno strumento come osql.exe, che non si riconnette automaticamente dopo che una connessione è stata interrotta. Ecco un modo per testare l’opzione di stato. Dal prompt dei comandi, digitare
osql -E -q"RAISERROR('Test Severity 16', 16, 1) WITH LOG"
Questo codice restituisce
Test Severity 161>
e si rimane in osql.exe. Eseguendo la seguente riga da un prompt dei comandi:
osql -E -q"RAISERROR('Test State 127', 16, 127) WITH LOG"
restituisce il messaggio di errore
Test State 127
e ritorna al prompt dei comandi, uscendo da osql.exe. Se si utilizza osql.,exe per generare un errore con uno stato di 127 dopo la creazione di un database non riesce, lo stato di errore termina la connessione e, di conseguenza, il resto dello script, in modo da non creare oggetti nel database sbagliato.
All’inizio dello script di creazione del database TSQLTutorJoins.sql, disponibile dal link “Scarica il codice” nella parte superiore della pagina, è il seguente codice:
Se il database non viene creato, la connessione viene interrotta e la parte di creazione dell’oggetto dello script non viene eseguita. L’ho impostato in questo modo per consentirti di determinare quali sono gli errori (ad esempio,, fuori spazio su disco, percorso errato) prima che il resto dello script venga eseguito. Senza questo codice, se la creazione del database fallisce e lo script continua, creerebbe tutti gli oggetti di test nel database predefinito.
Quando si automatizzano gli script, terminare l’esecuzione su un errore grave può essere estremamente utile. Sollevando un errore con una gravità elevata, registrandolo nel registro dell’applicazione del visualizzatore eventi e, cosa più importante, sollevandolo con uno stato di 127, si garantisce che nessun oggetto script venga creato nel database errato., Inoltre, registrandolo nel registro dell’applicazione del visualizzatore eventi, si dispone di una traccia di controllo dell’evento.