1. ホーム
  2. sql

[解決済み] TSQL - BEGIN ... ENDブロックの中でGOを使用する方法。ENDブロックの中でGOを使うには?

2022-11-21 08:55:39

質問

複数の開発用データベースからステージング/プロダクションに変更を自動的に移行するためのスクリプトを作成しています。 基本的には、変更スクリプトの束を受け取り、それらを 1 つのスクリプトにマージし、各スクリプトを 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 ブロック内で同じカラムを作成し、更新する方法はありますか?

どのように解決するのですか?

私は同じ問題に直面し、最終的にそれを解決するために使用することができました。 SET NOEXEC .

IF not whatever
BEGIN
    SET NOEXEC ON; 
END

ALTER TABLE dbo.EMPLOYEE ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever

SET NOEXEC OFF;