2009-02-25 10 views
7

私は次のコードを持っている: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 

は、そのテーブル「tblfoobar」はデータベースに存在しませんのでご注意ください。私がONにNOEXECを設定すると、メッセージの「メッセージ208」の部分を与えないかもしれないことを期待していた

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

:私はこのコードを実行すると、メッセージがアップします。

"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 

とのコードを実行、私は、次のメッセージが表示されます。

このスクリプトを実行する前に、DBをバージョン5に更新してください。

今回は、不足しているテーブルに関するメッセージはありません。

誰かがこの現象を私に説明できますか?ありがとう。

+0

私たちが同じページにいることを確認するだけです。これはSQL Server用ですか?どのバージョン? –

+0

申し訳ありませんが、私はそれを言及すべきでした。私はMS SQL 2000を使ってこのコードを試してみました。 – ahmjt

+0

SQL 2005で同じ動作が見られます –

答えて

3

"set noexec"を条件付きで使うのは妥当だとは思っていませんでしたが、実際は有効と思われます。

この動作は、DDL文であるという事実に関連しているようです。挿入をprintステートメントまたは単純なselectクエリで置き換えると、スクリプトは期待どおりに動作します。ところで

、私はこのような何かをしたい場合は、私は次のようなアプローチを使用します。

 
    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は、あなたが存在しないオブジェクトでストアドプロシージャを作成することができますので、あなたプロシージャを作成し、それを条件付きで実行してからドロップすることができます。これは、条件付きで欠落しているオブジェクトをデータベースに追加する、長いアップグレードスクリプトを持つ方法です。

おそらくこれを適応させることができます。次に無効なオブジェクトの問題を避けるため、最初にnoexecは必要ありません。

+0

INSERTをSELECTに置き換えてPRINT stmtをコメントすると、最初のエラーメッセージ(オブジェクトがありません)が表示されます。 PRINT文を保持すると、2番目のエラーメッセージが表示されます(オブジェクトが見つからないことは何もありません)。私がINSERTをtblfoobarのSELECTで置き換えた場合、スクリプトは期待どおりに動作しません。 – ahmjt

2

私は上記のコードをチェックして正常に動作します。不足しているオブジェクトのエラーメッセージは表示されません。

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 

NOEXECがオンであるため、以下のコードはコンパイルされず、実行されないため、エラーメッセージは表示されません。

+0

今はうまくいくようです! 5年前には機能しませんでした。他のユーザーからのコメントの一部がそれを確認したと思います。 – ahmjt

関連する問題