2016-07-12 4 views
2

Bei der Ausführung der folgenden in SSMS;Einstellung NOEXEC ON führt immer noch "USE" Anweisung

if not exists (select * from sys.databases where name = 'SWFUAT') 
begin 
    print 'The UAT database (SWFUAT) does not exist...' 
    set noexec on; 
end 
go 

use SWFUAT; 
go 

Folgendes wird angezeigt;

Die UAT Datenbank (SWFUAT) existiert nicht ...
Msg 911, Ebene 16, Status 1, Zeile 20
Datenbank 'SWFUAT' existiert nicht. Stellen Sie sicher, dass der Name korrekt eingegeben wurde.

Sollte der Compiler nicht einfach die "use" Anweisung ignorieren?

+0

@ shA.t Sie die Dokumentation Zustände korrekt waren jedoch mit beispielsweise ersetzen soll; > Wenn SET NOEXEC aktiviert ist, kompiliert SQL Server jeden Batch von Transact-SQL-Anweisungen, führt sie jedoch nicht aus. Und das Beispiel [Microsoft] [MSLink] bietet Shows 'noexec' wird wie oben gezeigt verwendet? [MSLink]: https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(NOEXEC_TSQL);((SQL12.SWB.TSQLRESULTS.F1);;;;;;;;;((SQL12.SWB .TSQLQUERY.F1); k (MISCELLANEOUSFILESPROJECT); k (DevLang-TSQL) & rd = true – Ray

+1

"USE wird sowohl zur Kompilier- als auch zur Ausführungszeit ausgeführt und tritt sofort in Kraft." - https://msdn.microsoft.com/de-de NZ/library/ms188366.aspx – Blorgbeard

Antwort

1

Wenn ich Ihre Frage richtig verstehe, dann wollen Sie

use SWFUAT; 

nur auszuführen, wenn die SWFUAT Datenbank vorhanden ist.

Leider wegen dieser Bemerkung

USE wird sowohl Zeit kompilieren und Ausführung ausgeführt und wird sofort wirksam. Daher werden Anweisungen, die nach der USE-Anweisung in einem Stapel erscheinen, in der angegebenen Datenbank ausgeführt.

beschrieben here Sie können nicht einfach die SET NOEXEC in Ihrem Fall verwenden. Um das zu erreichen, was Sie brauchen Sie den Code dieses

if not exists (select * from sys.databases where name = 'SWFUAT') 
begin 
    print 'The UAT database (SWFUAT) does not exist...' 
end else begin 
    use SWFUAT; 
end 
go 
Verwandte Themen