2017-08-16 5 views
1

テーブルがあり、既存のデータがあり、 'IsOnlineUser'というnull値のないビット列を追加したい場合は、既存のすべての行をfalseに設定します。テーブル既存の値を持つ列を追加する更新を書き込む方法

は、私が試した最初のSQLが

SET @ColumnExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = 'Member' AND COLUMN_NAME = 'IsOnlineUser'); 

IF (@ColumnExists = 0) 
BEGIN 
    ALTER TABLE Member ADD IsOnlineUser bit NULL; 

    UPDATE Member SET IsOnlineUser= 0; 
    ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL; 
END 
GO 

だったしかし、それは私に

無効を与える場合、私は私が展開するたびに実行するスクリプトのセットを持っているので、私は見るために、チェックが必要列名「IsOnlineUser」

SET @ColumnExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = 'Member' AND COLUMN_NAME = 'IsOnlineUser'); 

IF (@ColumnExists = 0) 
BEGIN 
    ALTER TABLE Member ADD IsOnlineUser bit NULL; 

END 
GO 

IF (@ColumnExists = 0) 
BEGIN 
    UPDATE Member SET IsOnlineUser= 0; 
    ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL; 
END 
GO 

しかし、これは

を言う:UPDATEが作成した列を見つけることができないので、仮にこれが私は私は2つの文の間で「GO」を置けば、それはので、私は次のようでした役立つだろうと思っています

スカラー変数 "@ColumnExists"を宣言しなければなりません。

これはGOが2つの間のスカラ変数にアクセスするのを止めるためですと仮定します。

あなたは、デフォルトの制約にnot nullとして列を追加することができます任意のヘルプははるかに

+0

@ columnExists =(...を設定する必要はありません)後にもう一度?変数が継続して保持されないため、https://stackoverflow.com/questions/937336/is-there-a-way-to-persist-a-variable-across-a-go – xQbert

+0

DECLARE @ColumnExists INT –

答えて

2

をいただければ幸いです、かなり一般的なユースケースのように思えるので、私は、私はちょうど何かが欠けていますと仮定します。

alter table Member add IsOnlineUser bit not null default 0; 

オプションで、あなたはとても似同時に制約に固有の名前を付けることができます:

alter table member 
    add IsOnlineUser bit not null 
    constraint df_Member_IsOnlineUser default 0; 

あなたの現在のロジックを維持しながら、あなただけの既存のコードの仕事をしたい場合は、SQL文字列の代わりに実行することができ

if not exists (
    select 1 
    from information_schema.columns 
    where table_name = 'Member' 
    and column_name = 'IsOnlineUser' 
) 
begin; 
alter table member 
    add IsOnlineUser bit not null 
    constraint df_Member_IsOnlineUser default 0; 
end; 

:あなたのif、あなたは変数をスキップして、そのようnot exists()を使用し簡単にするために

インラインコードexecまたはsp_executesqlです。

... 
if (@ColumnExists = 0) 
begin; 
    exec sp_executesql N'alter table Member add IsOnlineUser bit null'; 
    exec sp_executesql N'update Member set IsOnlineUser= 0;'; 
    exec sp_executesql N'alter table Member alter column IsOnlineUser bit not null;'; 
end; 
go 
0

カラムが存在しないかどうかを確認し、必要に応じて追加できます。その後、GOして、UPDATEとALTERのあとに行ってください。列が存在する場合と存在しない場合の両方で正しく実行されます。変数の必要はありません。

IF NOT EXISTS (SELECT * FROM sys.columns WHERE name = 'IsOnlineUser' AND object_id = OBJECT_ID('Member')) 
ALTER TABLE Member ADD IsOnlineUser bit NULL; 
GO 
UPDATE Member SET IsOnlineUser= 0; 
ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL; 
GO 

注:私はむしろANSI INFORMATION.SCHEMAよりもSQL ServerのSYSビューの使用を好む、その代替を見せたかったが、それは私だけです。あなたが好きなら、INFORMATION.SCHEMAを保管することができます。

Edit-PS:変数は1つのバッチ内にのみ存在します。 GOを使用した後では、前に宣言された変数は使用できません。

関連する問題