SQL Server Management Studio (SSMS) のクエリ エディターを使用して、SQLCMD スクリプトとしてクエリを記述および編集します。 SQLCMD スクリプトを使用して、同じスクリプト内の Windows システム コマンドと Transact-SQL ステートメントを処理できます。
SQLCMD モードを有効にする
クエリ エディターを使用して SQLCMD スクリプトを記述または編集するには、SQLCMD スクリプト モードを有効にする必要があります。 SQLCMD モードは既定では有効になっていません。 スクリプト モードを有効にするには、ツール バーの [SQLCMD モード] アイコンを選択するか、[クエリ] メニューから [SQLCMD モード] を選択します。
注
SQLCMD モードを有効にすると、クエリ エディターで IntelliSense と Transact-SQL デバッガーがオフになります。
クエリ エディターの SQLCMD スクリプトでは、すべての Transact-SQL スクリプトで使用されるのと同じ機能を使用できます。 次のような機能があります。
- 色分け
- スクリプトの実行
- ソース管理
- スクリプトの解析
- Showplan
クエリ エディターで SQLCMD スクリプトを有効にする
アクティブなクエリ エディター ウィンドウの SQLCMD スクリプトを有効にするには、次の手順に従います。
クエリ エディター ウィンドウを SQLCMD モードに切り替える
オブジェクト エクスプローラーでサーバーを右クリックし、[ 新しいクエリ ] を選択して新しいクエリ エディター ウィンドウを開きます。
[クエリ] メニューから [SQLCMD モード] を選びます。
SQLCMD ステートメントは、クエリ エディターのコンテキストで実行されます。
[SQL エディター] ツール バーの [使用できるデータベース] の一覧で、[
AdventureWorks2025] データベースを選択します。クエリ エディター ウィンドウで、次の Transact-SQL ステートメントと
!!DIRSQLCMD ステートメントを入力します。SELECT DISTINCT Type FROM Sales.SpecialOffer; GO !!DIR GO SELECT ProductCategoryID, Name FROM Production.ProductCategory; GOF5 キーを押して、Transact-SQL と MS-DOS のステートメントが混在するセクションを実行します。
1 番目と 3 番目のステートメントにより、2 つの SQL 結果ペインが表示されます。
[結果] ペインの [メッセージ] タブを選び、3 つのステートメントすべてから取得されたメッセージを確認します。
(6 row(s) affected)<The directory information>(4 row(s) affected)
Important
コマンド ラインから sqlcmd を実行すると、オペレーティング システムとの完全な対話が許可されます。 SQLCMD モードでクエリ エディターを使用する場合は、対話型ステートメントを実行しないように注意してください。 クエリ エディターは、オペレーティング システムのプロンプトに応答できません。 コマンド ラインから SQLCMD を実行する方法の詳細については、 sqlcmd ユーティリティを参照してください。
デフォルトで SQLCMD スクリプトを有効にする
SQLCMD スクリプト操作を既定で有効にするには、[ツール] メニューの [オプション] を選び、[クエリ実行]、[SQL Server] の順に展開して [全般] ページを選びます。[既定で、新しいクエリを SQLCMD モードで開始する] チェック ボックスをオンにします。
SQLCMD スクリプトの作成と編集
スクリプト モードを有効にした後は、SQLCMD コマンドと Transact-SQL ステートメントの両方を記述できます。 次の規則が適用されます。
SQLCMD コマンドは行の最初のステートメントでなければなりません。
各行に 1 つの SQLCMD コマンドだけを記述できます。
SQLCMD コマンドの前にコメントと空白を使用できます。
コメント文字の間にはさまれた SQLCMD コマンドは実行されません。
1 行のコメント文字は 2 つのハイフン (
--) であり、行の先頭に表示する必要があります。オペレーティング システム コマンドに 2 つの感嘆符 (
!!) のプレフィックスを付けます。 2 つの感嘆符が付いたコマンドの場合は、感嘆符の後のステートメントがcmd.exeコマンド プロセッサによって実行されます。!!の後のテキストは、cmd.exeするパラメーターとして渡されるため、最終的なコマンド ラインは次のように実行されます:"%SystemRoot%\system32\cmd.exe /c <text after !!>"。SQLCMD コマンドと Transact-SQL を明確に区別するには、すべての SQLCMD コマンドの前にコロン (
:) を付けます。GOコマンドは、前置きまたは前に!!:を付けずに使用できます。クエリ エディターでは、SQLCMD スクリプトの一部として定義する環境変数と変数がサポートされていますが、組み込みの SQLCMD 変数や osql 変数はサポートされていません。 SSMS は、SQLCMD 変数を大文字と小文字を区別して処理します。 たとえば、
PRINT '$(COMPUTERNAME)'は正しい結果を生成しますが、PRINT '$(ComputerName)'はエラーを返します。
注意事項
SSMS では、 SqlClient .NET ライブラリを使用して、通常モードと SQLCMD モードで実行します。
コマンド ラインからクエリを実行すると、sqlcmd は OLE DB プロバイダーを使用します。 既定のオプションが異なる場合があるため、SQLCMD ユーティリティの SQLCMD モードと比較して、SSMS 内の SQLCMD モードで同じクエリを実行すると、動作が異なる場合があります。
サポートされている SQLCMD 構文
クエリ エディターでは、次の SQLCMD スクリプト キーワードがサポートされています。
[!!:]GO[count]!! <command>:exit(statement):Quit:r <filename>:setvar <var> <value>-
:connect server[\instance] [-l login_timeout] [-U user [-P password]]1 :on error [ignore|exit]-
:error <filename>|stderr|stdout2 -
:out <filename>|stderr|stdout2
1:connect コマンドの詳細については、 sqlcmd ユーティリティーのコマンドを参照してください。
2 クエリ エディターは、とstderrの [stdout] タブに出力を送信します。
クエリ エディターでは、前の一覧に含まれていない SQLCMD コマンドはサポートされていません。 サポートされていない SQLCMD キーワードを含むスクリプトを実行すると、クエリ エディターはコマンドを無視します。 サポートされていないキーワードごとに、クエリ エディターは次のメッセージを送信先に送信します。
Ignoring command <ignored_command>
注意事項
コマンド ラインから SQLCMD を起動しないため、SQLCMD モードでクエリ エディターを実行する場合は、いくつかの制限があります。 変数などのコマンド ライン パラメーターを渡すことはできません。 また、クエリ エディターはオペレーティング システムのプロンプトに応答できないため、対話型ステートメントを実行しないように注意する必要があります。
SQLCMD スクリプトの色分け
SQLCMD スクリプトを有効にすると、スクリプトは色分けされます。 Transact-SQL キーワードの色分けは同じです。 SQLCMD コマンドは、影付きの背景で表示されます。
例示
次の例では、SQLCMD ステートメントを使用して、 testoutput.txtという名前の出力ファイルを作成します。 現在のディレクトリを出力する 2 つの Transact-SQL SELECT ステートメントと 1 つのオペレーティング システム コマンドを実行します。 結果のファイルには、 DIR ステートメントからのメッセージ出力と、Transact-SQL ステートメントからの結果の出力が含まれます。
:out C:\testoutput.txt
SELECT @@VERSION As 'Server Version';
!!DIR
!!:GO
SELECT @@SERVERNAME AS 'Server Name';
GO