クエリ エディターによる SQLCMD スクリプトの編集
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
SQL Server Management Studio のデータベース エンジン クエリ エディターを使うと、SQLCMD スクリプトとしてクエリを記述し、編集することができます。 Windows システムのコマンドと Transact-SQL ステートメントを同じスクリプトで処理する場合は、SQLCMD スクリプトを使います。
SQLCMD モード
データベース エンジン のクエリ エディターで SQLCMD スクリプトの作成や編集を行うには、SQLCMD スクリプト モードを有効にする必要があります。 クエリ エディターの SQLCMD モードは、既定では有効ではありません。 スクリプト モードを有効にするには、ツール バーの [SQLCMD モード] アイコンを選ぶか、[クエリ] メニューの [SQLCMD モード] を選びます。
注意
SQLCMD モードを有効にすると、データベース エンジン クエリ エディターで、IntelliSense と Transact-SQL デバッガーが無効になります。
クエリ エディターで SQLCMD スクリプトを操作するときには、あらゆる Transact-SQL スクリプトと同じ機能を使用することができます。 使用できる機能には、次のようなものがあります。
- 色分け
- スクリプトの実行
- ソース管理
- スクリプトの解析
- Showplan
クエリ エディターで SQLCMD スクリプトを有効にする
アクティブなデータベース エンジン のクエリ エディター ウィンドウで SQLCMD スクリプトを有効にするには、次の手順を実行します。
データベース エンジンのクエリ エディター ウィンドウを SQLCMD モードに切り替える
オブジェクト エクスプローラーで、サーバーを右クリックして [新しいクエリ] を選び、データベース エンジンのクエリ エディター ウィンドウを新しく開きます。
[クエリ] メニューから [SQLCMD モード] を選びます。
クエリ エディターは、クエリ エディターのコンテキストで SQLCMD ステートメントを実行します。
[SQL エディター] ツール バーの [使用できるデータベース] の一覧で、[
AdventureWorks2022
] データベースを選択します。クエリ エディター ウィンドウに、次の Transact-SQL ステートメントと
!!DIR
SQLCMD ステートメントを入力します。SELECT DISTINCT Type FROM Sales.SpecialOffer; GO !!DIR GO SELECT ProductCategoryID, Name FROM Production.ProductCategory; GO
F5 キーを押して、Transact-SQL と MS-DOS のステートメントが混在するセクションを実行します。
1 番目と 3 番目のステートメントにより、2 つの SQL 結果ペインが表示されます。
[結果] ペインの [メッセージ] タブを選び、3 つのステートメントすべてから取得されたメッセージを確認します。
- (6 件処理されました)
- <The directory information>
- (4 行処理されました)
重要
コマンド ラインから実行すると、 sqlcmd ユーティリティではオペレーティング システムとの完全な対話が可能になります。 クエリ エディターを 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 変数はサポートしていません。 SQL Server Management Studio による SQLCMD の処理では、大文字と小文字が区別されます。 たとえば、PRINT '$(COMPUTERNAME)' では正しい結果になりますが、PRINT '$(ComputerName)' ではエラーが返されます。
注意事項
SQL Server Management Studio では、標準および SQLCMD モードでの実行には、Microsoft.NET FrameworkSqlClient が使用されます。 コマンド ラインから SQLCMD を実行する場合は、OLE DB プロバイダーを使用することになります。 同じクエリでも、SQL Server Management Studio の SQLCMD モードで実行する場合と SQLCMD ユーティリティで実行する場合とでは、適用される既定のオプションが異なるので、動作も異なる可能性があります。
サポートされている SQLCMD 構文
データベース エンジン のクエリ エディターでは、以下の SQLCMD スクリプト キーワードをサポートしています。
[!!:]GO[count]
!! <command>
:exit(statement)
:Quit
:r <filename>
:setvar <var> <value>
:connect server[\instance] [-l login_timeout] [-U user [-P password]]
:on error [ignore|exit]
:error <filename>|stderr|stdout
:out <filename>|stderr|stdout
注意
:error
と :out
、stderr
と stdout
のいずれでも、出力は [メッセージ] タブに送信されます。
クエリ エディターでは、上記以外の SQLCMD コマンドをサポートしていません。 サポートされていない SQLCMD キーワードを含むスクリプトが実行されると、クエリ エディターは、サポートされていないキーワードの宛先ごとに、「< 無視されたコマンド>を無視しました」というメッセージを送信します。 スクリプトは正常に実行されますが、サポートされていないコマンドは無視されます。
注意事項
コマンド ラインから SQLCMD を実行する場合とは異なり、クエリ エディターの SQLCMD モードにはいくつかの制限事項があります。 まず、変数などのコマンドライン パラメーターを受け渡すことができません。また、クエリ エディターはオペレーティング システムのプロンプトに応答できないため、対話型のステートメントを実行しないように注意してください。
SQLCMD スクリプトの色分け
SQLCMD スクリプトが有効になっていると、スクリプトが色分けされます。 Transact-SQL キーワードの色分けは変わりません。 SQLCMD コマンドは、背景が影付きになります。
例
次の例では、現在のディレクトリを出力するために、SQLCMD ステートメントを使って testoutput.txt という出力ファイルを作成し、1 つのオペレーティング システム コマンドで 2 つの Transact-SQL の SELECT ステートメントを実行しています。 結果ファイルには、DIR
ステートメントからのメッセージ出力に続き、Transact-SQL ステートメントからの結果の出力が含まれます。
:out C:\testoutput.txt
SELECT @@VERSION As 'Server Version';
!!DIR
!!:GO
SELECT @@SERVERNAME AS 'Server Name';
GO