1つのテーブルの存在をチェックするifステートメントで次のSQLスクリプトを囲む必要があります。ステートメントにはさらに多くのフィールドがありますが、下のスニペットはそのアイディアを得るのに十分なはずです。sqlスクリプトのifとgoステートメント
if文でこのバッチ全体を囲むと、私は文章の間にGOsがあるのが好きではありません。私がGOを取り出すと、TMP_FIELDが無効な列であると不平を言う。
これを行うにはどうすればよいですか?私がしているのは、フィールドの束を取ってvarcharからdatetimeに変えることだけです。これはsetup.exeファイルの一部なので、一度だけ実行する必要があり、将来のアップグレードでは必要ありません。特定のテーブルが存在する場合は、スクリプトを実行しないでください。
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
ALTER TABLE MY_TABLE ADD TMP_FIELD datetime
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
UPDATE MY_TABLE SET TMP_FIELD = modifiedDate
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
ALTER TABLE MY_TABLE DROP COLUMN modifiedDate
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
ALTER TABLE MY_TABLE ADD modifiedDate datetime
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
UPDATE MY_TABLE SET modifiedDate = TMP_FIELD
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
ALTER TABLE MY_TABLE DROP COLUMN TMP_FIELD
GO
私はGOを取り出すと、modifiedDateに関するエラーが発生します。もしかして? 「GOを取り出すと、_modifiedDate_が無効な列であると不平を言う。 –
TMP_FIELDは無効な列です。 – Rod
私がテストしていたときにテーブルMY_TABLEを別に定義したと思います。私はテーブルスキーマにmodifiedDataという列を含めなかった。最初は例をあまり詳しく読んでいなかったので、作業している元のテーブルのスキーマはわかりませんでした。 –