複数の開発データベースからステージング/プロダクションに変更を自動的に移行するためのスクリプトを生成しています。基本的に、これは一連の変更スクリプトを受け取り、それらを単一のスクリプトにマージして、各スクリプトをIF whatever BEGIN ... ENDステートメントにラップします。
ただし、一部のスクリプトではGOステートメントが必要になるため、たとえば、SQLパーサーは、作成後に新しい列を認識します。
ALTER TABLE dbo.EMPLOYEE
ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO -- Necessary, or next line will generate "Unknown column: EMP_IS_ADMIN"
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
しかし、それをIFブロックでラップすると:
IF whatever
BEGIN
ALTER TABLE dbo.EMPLOYEE ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
END
BEGIN一致しないを送信しているため、失敗しますEND。しかし、それを削除するGOと、不明な列について再び不平を言います。
単一のIFブロック内で同じ列を作成および更新する方法はありますか?
GOそれ自体が一列に並んでいる必要があると思うので、単語のすべてのインスタンスではなく、そのケースのみを検索できますGO。2)どのステートメントが正常に完了したかを常にログに記録できます。または、全体をtry / catchでラップし、追跡する@lineNoなどの変数を使用して独自の行番号を使用し、エラーを報告することもできます。これらを自動的に生成しているので、このような変更は簡単です。あなたのすべての懸念に対して解決策が見つかると私が思うとき、このルートを探索したくないのは明らかです。