スクリプトでSSMSにSQLCMDモードの有効化/無効化を強制するディレクティブのようなものはありますか?
言われたように、方法はありません。
ただし、スクリプトヘッダーにクイックチェックを含めて、SQLCMDモードがオンになっているかどうかを確認する(そしてオンになっていない場合はスクリプトを終了する)ことが1つの方法です。
:setvar DatabaseName "MyDatabase"
GO
IF ('$(DatabaseName)' = '$' + '(DatabaseName)')
RAISERROR ('This script must be run in SQLCMD mode. Disconnecting.', 20, 1) WITH LOG
GO
-- The below is only run if SQLCMD is on, or the user lacks permission to raise fatal errors
IF @@ERROR != 0
SET NOEXEC ON
GO
PRINT 'You will not see this unless SQLCMD mode is on'
-- Rest of script goes here
GO
SET NOEXEC OFF
GO
重大度20が使用される理由があります。それは、接続がすぐに強制終了される傾向があり、スクリプトの後にGO
バッチターミネーターがあったとしても、それ以上のスクリプトコードの実行を妨げます。
重大度20〜24 :
システムの問題を示し、致命的なエラーであることを示します。これは、ステートメントまたはバッチを実行しているデータベースエンジンタスクが実行されなくなったことを意味します。タスクは何が発生したかに関する情報を記録してから終了します。ほとんどの場合、データベースエンジンのインスタンスへのアプリケーション接続も終了します。これが発生した場合、問題によっては、アプリケーションが再接続できない可能性があります。
この範囲のエラーメッセージは、同じデータベース内のデータにアクセスするすべてのプロセスに影響を与える可能性があり、データベースまたはオブジェクトが破損していることを示す場合があります。重大度レベルが19〜24のエラーメッセージは、エラーログに書き込まれます。
番号。
ただし、常に SQLCMDモードで実行でき、T-SQLを使用できます
SQLCMDコマンドとTransact-SQLを明確に区別するには、すべてのSQLCMDコマンドの前にコロン(:)を付ける必要があります。