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


17

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

回答:


17

すでに述べたように、方法はありません。

ただし、スクリプトヘッダーにクイックチェックを含めて、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 not see this unless SQLCMD mode is on'
-- Rest of script goes here

GO
SET NOEXEC OFF
GO

Severity 20が使用される理由がありGOます。スクリプトの後半にバッチターミネータが存在する場合でも、すぐに接続を強制終了し、それ以上のスクリプトコードの実行を妨げます。

重大度20-24

システムの問題を示し、致命的なエラーです。これは、ステートメントまたはバッチを実行しているデータベースエンジンタスクが実行されていないことを意味します。タスクは、発生した内容に関する情報を記録してから終了します。ほとんどの場合、データベースエンジンのインスタンスへのアプリケーション接続も終了する場合があります。これが発生した場合、問題によっては、アプリケーションが再接続できない場合があります。

この範囲のエラーメッセージは、同じデータベース内のデータにアクセスするすべてのプロセスに影響を与え、データベースまたはオブジェクトが破損していることを示す場合があります。重大度レベルが19〜24のエラーメッセージがエラーログに書き込まれます。


ssmsでは最初の2行で十分であり、sql 2000 Query Analyzerでは機能しますが、メッセージは表示されません。
-bernd_k

しかし、スクリプトは次のGOから実行を継続しませんか?
ダンノーラン

私はSSMS 2008 R2を使用していますが、2行が生成します:Meldung 102、Ebene 15、Status 1、Zeile 1 ':'付近の構文が正しくありません。SQL Server 2000 Query Analyzerを使用するには、RAISERRORを使用する必要があります。
bernd_k

4
前述のようにここで、あなたも設定することができますSET NOEXEC ONスクリプトの実行中に何かを防ぐために、追加の安全対策として。
Yahoo深刻な

うーん、これはSQLCMDモードを使用して、SQLCMDモードがオンになっているかどうかを確認しています。ただし、SQLの:setvarが削除/置換された場合、機能します。
Oak_3260548

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.