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

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のエラーメッセージがエラーログに書き込まれます。

コメント

  • ssmsの場合は最初の2行で十分であり、sql 2000 Query Analyzerの場合は機能しますが、メッセージは表示されません。
  • ただし、'スクリプトは次のGOから実行を継続しますか?
  • ここで説明したように、SET NOEXEC ONスクリプト内の他のものが実行されないようにするための追加の安全対策として。
  • @Dan Nolan:なるほど、どういうわけか3行目のポイントを逃しました。したがって、正しく理解していれば、' SQLCMDモードをオフにする解決策はありません。最初に:setvarがあるため、基本的にincorrect syntax near ':'が表示されます…
  • @youcantryreachingme RAISERROR重大度レベル20(およびそれ以上)は、SQLによって致命的なエラーと見なされ、接続がすぐに切断されるため、それ以上のバッチはありません(SET NOEXEC ON)が実行されます。 NOEXECステートメントが存在する理由は、実行中のユーザーがsysadmin / 特権。致命的なエラーを発生させるために必要です。

回答

いいえ。

ただし、いつでも SQLCMDモードで実行し、T-SQLを含めることができます

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

コメント

  • これはSQLServer 2012/2014/2016でも引き続き有効ですか?
  • @ hot2use:はい、I ' 2014/2016に使用しました

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です