2011-01-21 11 views
3

この作品、なぜ誰もが説明できます:GOTOラベル

use MyDb1 
if NOT EXISTS (select * from sys.objects where name = 'MyTable' and type = 'U') 
create table MyTable(MyColumn int not null) 
use MyDb2 
if NOT EXISTS (select * from sys.objects where name = 'MyTable' and type = 'U') 
create table MyTable(MyColumn int not null) 

しかし、これはしません:

use MyDb1 

mylabel: 
if NOT EXISTS (select * from sys.objects where name = 'MyTable' and type = 'U') 
create table MyTable(MyColumn int not null) 

if(DB_NAME()='MyDb1') 
begin 
    use MyDb2 
    goto mylabel 
end 

流れが正しいとそうでない場合は第2回のチェックが作品を存在しますが、テーブルを作成しようとすると、次のエラーが発生します。

データベースに「MyTable」という名前のオブジェクトが既に存在します。

これを大幅に簡素化されますが、これは動作するように得ることは私に2つのほぼ同じデータベース

+1

うわー、私も決して実現T-SQLが 'GOTO' – LittleBobbyTables

+0

をサポートし始めそれは常にで、それをサポートしてきました少なくとも2000年から – RichardTheKiwi

+0

誰かが興味を持っているのなら、これを使用したかったのは、私の開発環境では、ユーザテスト用と自動ユニットテスト用の2つのデータベースがあるからです。これらの両方は、ユーザーテストdbにいくつかのデフォルトデータがあることを除いては同じですが、各テストが必要なデータをセットアップするたびに単位テストdbは空です。私は単純に、同じデータベースを2回作成する便利な手段を望んでいましたが、db名に基づいて条件付きの挿入を2回行うだけでした。私は怠惰で、すべてのcreateステートメントを倍増させたくないし、インラインコマンドライン呼び出しを使うことに頼らざるを得ませんでした。 – DannyT

答えて

1

非常に奇妙な行動間で複製テーブルの作品の多くを保存します。私が推測しなければならないのは、ラベルの上に座っているのは「使用データベース」の文脈だと言います。 はT-SQLのラベルを使用しますが、あなたの呼び出しは使用しません。

このテストの結果は正しい動作を示していますが、何の理由もありませんでした。あなたはコメントを解除した場合のラインが< < <をマークし、1つ上のコメント、それはその後、

set nocount on 
use tempdb 
create database db1 
create database db2 
GO 

use db1 

mylabel: 
print 'in-' + db_name() 
if NOT EXISTS (select * from sys.objects where name = 'MyTable' and type = 'U') 
begin 
    print 'create-' + db_name() 
    create table MyTable(MyColumn int not null) 
    -- exec ('create table MyTable(MyColumn int not null)') -- <<< 
end 

if(DB_NAME()='db1') 
begin 
    print 'switch' 
    use db2 
    goto mylabel 
end 

GO 
use tempdb 
drop database db1 
drop database db2 

正しく動作出力:

in-db1 
create-db1 
switch 
in-db2 
create-db2 
Msg 2714, Level 16, State 6, Line 9 
There is already an object named 'MyTable' in the database. 
+0

ありがとう、それを並べ替えるが、私はすべてintellisenseなどを失うので、私は今のところ2つのスクリプトを持っているつもりです。 – DannyT

0

変更:

(MYCOLUMN int型テーブルMyTableというの作成nullではない)

に:

のexec sp_executesqlをN'createテーブルMyTableという(MYCOLUMN int型ではないnull)」の