5

テーブルに新しいカラムを追加して後でカラムを処理するためのストアドプロシージャを1つだけ持つことはできますか?例えば、私は、ストアドプロシージャ、次のいる:ストアドプロシージャにカラムを追加する

... 

alter table tb1 
add col1 varchar(1) null 

insert into tb1(col1) 
values ('Y') 

を私は

COL1が無効であるというエラーを得ました。

+0

あなたが列を追加した後、goコマンドを実行しますか。? – Muthukumar

+5

ストアドプロシージャの途中でGOステートメントを使用することはできません – LittleBobbyTables

+0

SQL Serverは、プロシージャを作成するときにカラムが存在するかどうかをチェックしているため、カラムを手動で追加してから、これを動作させるための列。 @LittleBobbyTablesが追加した動的SQLの回避策を提案しますが、おそらく代わりに 'sp_executesql'を使用します。 –

答えて

11

後で値を挿入するのではなく、デフォルト値 'Y'を使用してテーブルを作成してみてください。

alter table tb1 add col1 varchar(1) not null DEFAULT ('Y') 

あなたはGOドキュメントごとに、表が作成されていために、2つのライン間でGOが必要になります

SQL Serverのユーティリティは、彼らが現在のバッチを送信する必要があることを信号としてGOを解釈SQL ServerのインスタンスへのTransact-SQLステートメント

ただし、ストアードプロシージャにはGOステートメントを使用できません。

EDIT

代わりに、あなたはあなたのコードを実行するEXECステートメントを使用することができます

EXEC ('alter table tb1 add col1 varchar(1) null') 
EXEC ('update tb1 set col1 = ''Y''') 
+0

私は例を挙げていますが、実際にはストアドプロシージャでは他にも多くのことがあります。ストアプロシージャの外でテーブルを変更する必要があるかどうかは不思議です。 – GLP

+0

@ GaolaiPeng - 私の編集を参照 – LittleBobbyTables

+1

一般的に、ストアドプロシージャの外でテーブルを変更する方が良い選択です。あなたは本当にprocを実行するたびにカラムを追加したいのですか、それとも一度だけ追加したいのですか? PLUSは、SQlスクリプトとして保存されたすべての構造変更をソース管理に入れて、それらを動かすか、anotehrサーバ上でデータベースを再作成するのを簡単にします。 – HLGEM

関連する問題