2009-02-25 4 views
7

Ich habe den folgenden Code:Wie funktioniert 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 

Bitte beachten Sie, dass die Tabelle "tblfoobar" existiert nicht in der Datenbank. Wenn ich diesen Code ausführen, kommt die Meldung auf:

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

Ich hatte erwartet, dass noexec auf ON darf jedoch nicht den „Msg 208“ Teil der Nachricht geben.

Dann noch einmal "set noexec on" kompiliert den Code, führt es nicht aus. Der Versuch, etwas in eine Tabelle einzufügen, die nicht existiert, ist ein Kompilierungsfehler - ich vermute. Wenn dies der Fall ist, sollte der Fehler "fehlendes Objekt" auftreten.

Jetzt lassen Sie mich Ihnen das seltsame Verhalten sagen, das ich beobachtet habe. Wenn ich den Kommentar aus der Zeile entfernen „- Print‚Dummy‘“

-- 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 

und führen Sie den Code, erhalte ich nur die folgende Meldung.

Bitte aktualisieren Sie Ihre Datenbank auf Version 5, bevor Sie dieses Skript ausführen.

Dieses Mal gibt es keine Nachricht über fehlende Tabelle.

Kann mir bitte jemand dieses Verhalten erklären? Vielen Dank.

+0

Nur um sicherzustellen, dass wir auf der gleichen Seite sind: Dies ist für SQL Server? welche Version? –

+0

Entschuldigung, ich hätte es erwähnen sollen. Ich habe diesen Code mit MS SQL 2000 versucht. – ahmjt

+0

Ich sehe das gleiche Verhalten in SQL 2005 –

Antwort

3

Ich hätte nicht erwartet, dass es gültig ist, "set noexec" innerhalb einer Bedingung wie Sie es getan haben, aber in der Tat scheint es gültig zu sein.

Das Verhalten scheint mit der Tatsache verbunden zu sein, dass es eine DDL-Anweisung ist. Wenn Sie Ihre Einfügung durch eine Print-Anweisung oder eine einfache Select-Abfrage ersetzen, funktioniert das Skript wie erwartet.

By the way, wenn ich so etwas wie dies tun wollen, verwende ich folgende Vorgehensweise vor:

 
    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 Sie eine gespeicherte Prozedur mit einem Objekt erstellen können, die nicht vorhanden ist, so dass Sie kann die Prozedur erstellen, sie bedingt ausführen und sie dann löschen. Auf diese Weise habe ich ein langes Upgrade-Skript, das fehlende Objekte meiner Datenbank bedingt hinzufügt.

Sie könnten dies vielleicht anpassen. Dann brauchen Sie das noexec überhaupt nicht, weil Sie das ganze Problem mit ungültigen Objekten vermeiden.

+0

Wenn ich INSERT durch SELECT und Kommentar PRINT stmt ersetze, erhalte ich die erste Fehlermeldung (fehlendes Objekt). Wenn ich die PRINT-Anweisung behalte, erhalte ich die zweite Fehlermeldung (nichts über fehlendes Objekt). Das Skript funktioniert nicht wie von mir erwartet, wenn ich das INSERT durch ein SELECT von tblfoobar ersetze. – ahmjt

2

Ich habe oben Code überprüft und es funktioniert gut. Es gibt keine Fehlermeldung für fehlendes Objekt.

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 

Seit NOEXEC ist daher der folgende Code kompiliert werden, nicht ausgeführt wird, daher wird es nicht durch eine Fehlermeldung.

+0

Es scheint OK jetzt zu arbeiten! Es hat vor 5 Jahren nicht funktioniert, und ich denke, einige Kommentare von anderen Nutzern haben es bestätigt. – ahmjt