2009-02-25 11 views
7

Ho il codice seguente:Come funziona SET NOEXEC ON?

-- start of code 
set noexec off 

declare @requiredVersion int 
declare @currentVersion int 

set @requiredVersion = 5 
set @currentVersion = 4 

if (@currentVersion < @requiredVersion) 
begin 
    print 'Please update your DB to version 5 before running this script.' 
    set noexec on 
end 

go 
-- print 'Dummy' 
insert into tblFooBar(name) values ('AAA') 
go 

set noexec off 
-- end of code 

prega di notare che la tabella "tblfoobar" non esiste nel database. Quando ho eseguito questo codice, il messaggio viene in su:

 
Please update your DB to version 5 before running this script. 
Msg 208, Level 16, State 1, Line 1 
Invalid object name 'tblFooBar'. 

mi aspettavo che la creazione di noexec su ON non può dare la parte "Msg 208" del messaggio.

Quindi di nuovo "imposta noexec on" compila il codice, non lo esegue. Cercare di inserire qualcosa in una tabella che non esiste è un errore in fase di compilazione - sto indovinando. Se questo è il caso, allora dovrebbe comparire l'errore "oggetto mancante".

Ora lascia che ti dica lo strano comportamento che ho osservato. Se rimuovo il commento della linea "- Stampa 'fittizio'"

-- start of code 
set noexec off 

declare @requiredVersion int 
declare @currentVersion int 

set @requiredVersion = 5 
set @currentVersion = 4 

if (@currentVersion < @requiredVersion) 
begin 
    print 'Please update your DB to version 5 before running this script.' 
    set noexec on 
end 
go 
print 'Dummy' 
insert into tblFooBar(name) values ('AAA') 
go 

ed eseguire il codice, ho solo il seguente messaggio.

Prima di eseguire questo script, aggiornare il DB alla versione 5.

Questa volta non ci sono messaggi sulla tabella mancante.

Qualcuno può spiegarmi questo comportamento? Grazie.

+0

Giusto per essere sicuri che siamo sulla stessa pagina: questo è per SQL Server? quale versione? –

+0

Mi dispiace, avrei dovuto dirlo. Ho provato questo codice utilizzando MS SQL 2000. – ahmjt

+0

Sto vedendo lo stesso comportamento in SQL 2005 –

risposta

3

Non mi sarei mai aspettato che fosse valido usare "set noexec" all'interno di un condizionale come hai fatto, ma in effetti sembra essere valido.

Il comportamento sembra essere correlato al fatto che si tratta di una dichiarazione DDL. Se si sostituisce l'inserto con un'istruzione di stampa o una query di selezione semplice, lo script funziona come previsto.

A proposito, se voglio fare qualcosa di simile, io uso il seguente approccio:

 
    create proc tmproc_foobar as 
     CREATE TABLE tblFooBar(name nvarchar(20)) 
    go 

    if exists (select 1 from sysobjects where type = 'U' and name = 'tblFooBar') 
     exec tmproc_foobar 
    go 

    drop proc tmproc_foobar 
    go 

SQL Server consente di creare una stored procedure con un oggetto che non esiste, in modo da può creare la procedura, eseguirla in modo condizionale, quindi rilasciarla. Questo è il modo in cui ho un lungo script di aggiornamento che aggiunge in modo condizionale oggetti mancanti al mio database.

Si potrebbe adattare questo forse. Quindi non è necessario il noexec in primo luogo perché si evita l'intera questione di oggetti non validi.

+0

Se sostituisco INSERT con SELECT e commento STAMPA stmt, ottengo il primo messaggio di errore (oggetto mancante). Se tengo l'istruzione PRINT, ottengo il secondo messaggio di errore (niente sull'oggetto mancante). Lo script non funziona come previsto (da me) se sostituisco l'INSERT con un SELECT da tblfoobar. – ahmjt

2

Ho controllato il codice sopra e funziona correttamente. Non fornisce alcun messaggio di errore per l'oggetto mancante.

set noexec off 

declare @requiredVersion int 
declare @currentVersion int 

set @requiredVersion = 5 
set @currentVersion = 4 

if (@currentVersion < @requiredVersion) 
begin 
    print 'Please update your DB to version 5 before running this script.' 
    set noexec on--> here we are setting NOEXEC on 
end 

go 
-- print 'Dummy' 
insert into tblFooBar(name) values ('AAA') 
go 

set noexec off 
-- end of code 

Da NOEXEC è in cui il codice di seguito viene compilato non viene eseguito, quindi lo farà non attraverso alcun messaggio di errore.

+0

Sembra funzionare ora bene! Non funzionava 5 anni fa e penso che alcuni dei commenti degli altri utenti lo abbiano confermato. – ahmjt

Problemi correlati