いくつかのアクションを実行し、その後(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は完全に機能しました(トランザクションを作成する必要はありません)。 ALTER TABLE MyTable ADD除算int NOT NULL DEFAULT 0 ありがとう! –
おっと、ただ実現しました。私は列の既定値が欲しいわけではありません。後で簡単に取り除く方法はありますか? (それは制約です) –
はい、 'ALTER TABLE DROP CONSTRAINT'を実行できるはずです。ここにキャッチがあります:あなたは 'TABLE CREATE'コマンドで作成する場合、自動生成される制約名が必要です。したがって、 'sys'データテーブルから制約を引き出すためのクエリが必要になります。 – Brad