web-dev-qa-db-ja.com

スクリプト内からSQLCMDモードを有効にできますか?

スクリプトでSSMSにSQLCMDモードの有効化/無効化を強制するディレクティブのようなものはありますか?

17
bernd_k

言われたように、方法はありません。

ただし、スクリプトヘッダーにクイックチェックを含めて、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のエラーメッセージは、エラーログに書き込まれます。

17
Dan Nolan

番号。

ただし、常に SQLCMDモードで実行でき、T-SQLを使用できます

SQLCMDコマンドとTransact-SQLを明確に区別するには、すべてのSQLCMDコマンドの前にコロン(:)を付ける必要があります。

7
gbn