SSMSにSQLCMDモードを有効/無効にするためにスクリプトで使用できるディレクティブのようなものはありますか?
回答
すでに述べたように、「方法はありません。
ただし、1つだけスクリプトヘッダーにクイックチェックを含めて、SQLCMDモードがオンになっているかどうかを確認します(オンになっていない場合はスクリプトを終了します)。
: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 only see this when SQLCMD mode is on" -- Rest of script goes here GO SET NOEXEC OFF GO
あります。重大度20が使用される理由は、接続をすぐに切断する傾向があり、スクリプトの後半にGO
バッチターミネータがある場合でもスクリプトコードが実行されないようにします。
重大度20〜24 :
システムの問題を示し、致命的なエラーです。これは、ステートメントまたはバッチを実行しているデータベースエンジンタスクが実行されていないことを意味します。タスクは、発生した内容に関する情報を記録してから終了します。ほとんどの場合、へのアプリケーション接続データベースエンジンのインスタンスも終了する場合があります。これが発生した場合、問題によってはemの場合、アプリケーションは再接続できない可能性があります。
この範囲のエラーメッセージは、同じデータベース内のデータにアクセスするすべてのプロセスに影響を及ぼし、データベースまたはオブジェクトが破損していることを示している可能性があります。重大度が19〜24のエラーメッセージがエラーログに書き込まれます。
コメント
回答
いいえ。
ただし、いつでも SQLCMDモードで実行し、T-SQLを含めることができます
SQLCMDコマンドとTransact-SQLを明確に区別するには、すべてのSQLCMDコマンドの前にコロン(:)を付ける必要があります。
コメント
- これはSQLServer 2012/2014/2016でも引き続き有効ですか?
- @ hot2use:はい、I ' 2014/2016に使用しました
SET NOEXEC ON
スクリプト内の他のものが実行されないようにするための追加の安全対策として。:setvar
があるため、基本的にincorrect syntax near ':'
が表示されます…RAISERROR
重大度レベル20(およびそれ以上)は、SQLによって致命的なエラーと見なされ、接続がすぐに切断されるため、それ以上のバッチはありません(SET NOEXEC ON
)が実行されます。NOEXEC
ステートメントが存在する理由は、実行中のユーザーがsysadmin
/ 特権。致命的なエラーを発生させるために必要です。