これに少し似たSQLの塊があります
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = '{FOO}')
BEGIN
EXECUTE ('CREATE DATABASE {FOO}')
ALTER DATABASE {FOO} SET AUTO_CLOSE OFF
END
{FOO}
実行時に、ユーザーが構成可能なデータベースの名前に置き換えられます。ロジックは、データベースが既に存在する場合、データベースを作成したくないということです。
その場合、クエリの実行時にエラーが発生し{FOO}
ますtempdb
オプション 'AUTO_CLOSE' は、データベース 'tempdb' では設定できません。
私の質問は、なぜこの失敗が発生するのですか? ゼロの結果を返すので、ペアSELECT * FROM sys.databases WHERE name = 'tempdb'
全体が実行されるべきではないことは確かですか? BEGIN/END
実際、print
begin と end の間にステートメントを挿入しても、何も出力されません。
私の推測では、SQL Server は SQL に対して何らかのリンティングを行って、tempdb をいじらないようにしているのではないでしょうか? EXECUTE
代わりに使用して問題を解決しましたが、なぜそうしなければならないのか少し混乱しています!