2012-04-22 12 views
15

トラブルそれ以下のSQLを考える

メッセージ207、レベル16、状態1、行10無効な列名 ':

IF EXISTS (SELECT * FROM sys.columns WHERE name = 'NewFieldName' AND object_id = OBJECT_ID('dbo.MyTableName')) 
    RETURN 

-- Add NewFieldName column to part of the Summer 2012 release cycle. 
ALTER TABLE dbo.[MyTableName] ADD 
    [NewFieldName] SmallINT NOT NULL 
     CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = 'FindMe' --Update one specific value 

は、次のエラーメッセージを生成しますNewFieldName '。

私は何か基本的なものが欠けていると確信していますが、変更後に "GO"を入れようとすると、毎回UPDATEが実行され、それをやりたくありません。

このステートメントを構造化して、列が存在するかどうかを確認し、それが追加されていないかどうかを確認してから、UPDATEステートメントのように値を設定する方法はありますか?

+0

最初の更新文は冗長です。すべてのレコードを 'default(2) 'で設定します。 –

+0

上記の文が私のために働きました。あなたはどのようにそれらを実行していますか?列 'NewFieldName'が作成されていますか? –

+0

@AmirIsmailが間違っています。 ALTER文を実行すると、フィールドが作成されますが、既定値は既存のレコードに設定されません。たぶん、それを行うためにALTERを書く別の方法があります。現在の構造は既存の行のデフォルト値を設定しません。 – ray

答えて

17

新しい列が追加された後でコンパイルするには、新しい列を参照するステートメントが必要です。これを行う1つの方法は、EXECを子バッチとして実行することです。

IF NOT EXISTS (SELECT * 
       FROM sys.columns 
       WHERE name = 'NewFieldName' 
         AND object_id = OBJECT_ID('dbo.MyTableName')) 
BEGIN 
    -- Add NewFieldName column to part of the Summer 2012 release cycle. 
    ALTER TABLE dbo.[MyTableName] 
      ADD [NewFieldName] SMALLINT NOT NULL 
      CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

    EXEC(' UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = ''FindMe''') 
END 

バッチがテーブルを参照することで、すべての文が延期、コンパイルの対象となっていることを意味ので、コンパイルされたときに、テーブル自体が存在しなかったので、それはもともとあなたのために働いた理由と考えられます。

関連する問題