2009-07-17 8 views
0

SQL Serverを取得2005は、SQLテーブルのスクリプトに非NULL列を追加します - エラー

Is_Active列が以前にDim_Formテーブルに存在していた場合は、エラーのないSQL作業の3行を次のよう。

つまり、Is_Activeが以前に存在しなかった場合、以下の3行を実行するとエラーが表示されます。

ALTER TABLE dbo.Dim_form add Is_Active bit NULL 
UPDATE dbo.Dim_form set Is_Active = 1 
ALTER table dbo.Dim_form alter column Is_Active bit NOT NULL 

私はこのエラーを取得する場合にのみ、そのA 'ブランドの新しい' 欄

Msg 207, Level 16, State 1, Line 2 
Invalid column name 'Is_Active'. 

私はこの

ALTER TABLE dbo.Dim_form add Is_Active bit NULL 
GO 

UPDATE dbo.Dim_form set Is_Active = 1 
ALTER TABLE dbo.Dim_form alter column Is_Active bit NOT NULL 

-- and now drop the newly created column 
ALTER TABLE dbo.Dim_form DROP COLUMN Is_Active 

は、今私は成功したSQLの元の3行を実行することができます実行する場合 - これで何が起こっているのでしょうか?

なぜ以前の列の存在がスクリプトに影響しますか?

答えて

2

これは私の質問に答えませんが、Is_Active列が以前にテーブルに存在していたかどうかに関係なく、私が使用したスクリプトは一貫して機能します。あなたが最初の「二つのバッチ」が同じで、元の3行を実行し、...そのビットが理にかなっているが、「第三のバッチ」について、すなわち、正常列を作成した後、あなたはそれを削除何を実行OK

ALTER TABLE dbo.Dim_form 
     ADD Is_Active bit NOT NULL 
      CONSTRAINT TEMP_ISACTIVE_CONSTRAINT_Dim_form DEFAULT 1 

    ALTER TABLE dbo.Dim_form 
     DROP CONSTRAINT TEMP_ISACTIVE_CONSTRAINT_Dim_form 
2

SQLが最初のバージョンで解析されるとき、その列は存在しません。そのため、解析フェーズは失敗します。

2番目のバージョンでは、SQLを別々のバッチに分割しているため、各バッチはそれぞれ単独で解析されます。最初のバッチは列を作成し、2番目のバッチは実行前に解析され、現在の列が存在するためすべてが正常です。

+0

それは間違いなく動作します。 –

+1

「3番目のバッチ」では、Is_Active列を削除して3本の元の行を実行します。バッチが解析されるとき、Is_Active列は存在しなくても存在しますが、パーザはバッチを解析する時点でSQL Serverの状態をすべて見ることができるため、その行は表示されません。 –

+0

okありがとうございますが、Is_Active列は削除後もまだどこにありますか?私は列を削除し、接続を閉じて、新しいクエリウィンドウを開き、元の3行を実行し、彼らはまだ動作します。 –

関連する問題