2010-11-23 2 views
1

いくつかのアクションを実行し、その後(existantされていない場合)の列を作成し、再実行可能なT-SQLスクリプトを実行し、する必要があります0に、それがNULL可能でない作り、リスト に追加し、既存のPKを再作成これまでのところ、私はこの持っている:値を更新し、私は、SQL Server 2005の</p> <p>アイデアが列を作成することですを使用してい

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'Division') 
BEGIN 
    ALTER TABLE MyTable ADD Division int NULL 
    UPDATE MyTable SET Division = 0 
    ALTER TABLE MyTable ALTER COLUMN Division int NOT NULL 

    ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [PK_MyTable] 

    ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
    (
     [ID] ASC, 
     [OfferCode] ASC, 
     [StationCode] ASC, 
     [Market] ASC, 
     [Division] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

END 

を問題は、新たなように、私は「GO」の文を必要とするということです列が作成されます。そうでなければ、値を0に更新しようとするとエラーが発生します。「GO」文を置くと、if節は機能しません(現在の列が存在するため)。私は@ColumnWasCreatedのような変数にその状態を入れることを考えていましたが、 "GO"ステートメントはまったく新しいスクリプトを開始するようなもので、変数の値は失われていました アイデア??

答えて

2

OPTION 1

代わりのGOADD COLUMNを包含するTRANSACTIONを試みます。コミットしてUPDATEかどうか確認してください。あなたADD COLUMN、この方法は、あなたがnullsを許可しないようにUPDATEまたはALTERに持っていないとき2

オプションは、デフォルト値の制約を設定してみてください。

+0

オプション2は完全に機能しました(トランザクションを作成する必要はありません)。 ALTER TABLE MyTable ADD除算int NOT NULL DEFAULT 0 ありがとう! –

+0

おっと、ただ実現しました。私は列の既定値が欲しいわけではありません。後で簡単に取り除く方法はありますか? (それは制約です) –

+1

はい、 'ALTER TABLE DROP CONSTRAINT'を実行できるはずです。ここにキャッチがあります:あなたは 'TABLE CREATE'コマンドで作成する場合、自動生成される制約名が必要です。したがって、 'sys'データテーブルから制約を引き出すためのクエリが必要になります。 – Brad

関連する問題