適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric SQL Database
sqlcmd ユーティリティを使用すると、Transact-SQL ステートメント、システム プロシージャ、スクリプト ファイルを入力できます。
注
システムにインストールされている sqlcmd のバリアントとバージョンを確認するには、 sqlcmd ユーティリティのインストール済みバージョンを確認するを参照してください。 sqlcmd を取得する方法については、「sqlcmd ユーティリティのダウンロードとインストール」を参照してください。
sqlcmd では、Transact-SQL ステートメントの他に次のコマンドも使用できます:
GO [ <count> ]:List[:]RESET:Error[:]ED1:Out[:]!!:Perftrace[:]QUIT:Connect[:]EXIT:On Error:r:Help:ServerList1:XML [ ON | OFF ]1:Setvar:Listvar
1 Linux または macOS ではサポートされていません。
sqlcmd コマンドを使用するときは、次の点に注意してください:
を除くすべての
GOコマンドは、コロン (:) によってプレフィックス指定する必要があります。Von Bedeutung
既存の osql スクリプトとの下位互換性を維持するために、一部のコマンドはコロンなしで認識され、
:によって示されます。sqlcmd コマンドが認識されるのは、コマンドが行の先頭にある場合のみです。
すべての sqlcmd コマンドには、大文字と小文字の区別はありません。
各コマンドは個別の行に指定する必要があります。 コマンドの後には、Transact-SQL ステートメントや別のコマンドを指定できません。
コマンドは即座に実行されます。 Transact-SQL ステートメントのように、実行バッファーに配置されません。
編集コマンド
[:]ED
テキスト エディターを開始します。 このエディターは、現在の Transact-SQL バッチまたは最後に実行したバッチを編集する場合に使用できます。 最後に実行したバッチを編集するには、最後のバッチの実行が完了した直後に ED コマンドを入力する必要があります。
テキスト エディターは、SQLCMDEDITOR 環境変数で定義されます。 既定のエディターは Edit です。 エディターを変更するには、SQLCMDEDITOR 環境変数を設定します。 たとえば、エディターを Microsoft メモ帳に設定するには、コマンド プロンプトで次のように入力します:
SET SQLCMDEDITOR=notepad
[:]リセット
ステートメント キャッシュをクリアします。
:リスト
ステートメント キャッシュの内容を出力します。
変数
:Setvar <var> [ "値" ]
sqlcmd スクリプト変数を定義します。 スクリプト変数は $(VARNAME)という形式になります。
変数名では大文字と小文字が区別されません。
スクリプト変数は次の方法で指定できます:
- コマンド ラインのオプションを暗黙的に使用します。 たとえば、
-lオプションではSQLCMDLOGINTIMEOUTsqlcmd 変数が設定されます。 :Setvarコマンドを明示的に使用します。- sqlcmd を実行する前に環境変数を定義する。
 
注
-X オプションを使用すると、環境変数が sqlcmd に渡されなくなります。
:Setvar を使って定義した変数と環境変数が同じ名前の場合は、:Setvar を使用して定義した変数が優先されます。
変数名には空白文字を含めることはできません。
変数名には、$(var) のような変数表現と同じ形式を使うことはできません。
スクリプト変数の文字列値に空白文字が含まれる場合は、値を引用符で囲みます。 スクリプト変数の値を設定していない場合は、そのスクリプト変数は削除されます。
:Listvar
現在設定されているスクリプト変数の一覧を表示します。
注
sqlcmdによって設定されたスクリプト変数および :Setvar コマンドを使用して設定された変数のみが表示されます。
出力コマンド
:エラー <filename> | STDERR | STDOUT
すべてのエラー出力を、"ファイル名" によって指定されたファイル、、または stderr にリダイレクトします。stdout :Error コマンドは、1 つのスクリプト内で複数回使用できます。 既定では、エラー出力は stderr に送られます。
ファイル名
出力を受信するファイルを作成して開きます。 ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。 権限またはその他の理由でファイルが使用できない場合は、出力は切り替えられず、最後に指定した出力先または既定の出力先に送信されます。
STDERR
エラー出力を
stderrストリームに切り替えます。 出力がリダイレクトされた場合、ストリームのリダイレクト先のターゲットはエラー出力を受け取ります。STDOUT
エラー出力を
stdoutストリームに切り替えます。 出力がリダイレクトされた場合、ストリームのリダイレクト先のターゲットはエラー出力を受け取ります。
:Out <ファイル名> | STDERR | STDOUT
すべてのクエリ結果を、file nameによって指定されたファイル、または stderr や stdout に作成してリダイレクトします。 既定では、出力は stdout に送られます。 ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。 :Out コマンドは、1 つのスクリプト内で複数回使用できます。
:Perftrace <ファイル名> | STDERR | STDOUT
すべてのパフォーマンス トレース情報を、file nameによって指定されたファイル、または stderr や stdout に作成してリダイレクトします。 既定では、パフォーマンス トレース出力は stdout に送られます。 ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。 :Perftrace コマンドは、1 つのスクリプト内で複数回使用できます。
実行制御コマンド
:On Error [ exit | ignore ]
スクリプト実行中またはバッチ実行中のエラー発生時に対応するアクションを設定します。
exit オプションを使用した場合、sqlcmd は該当するエラー値を表示して終了します。
ignore オプションを使用すると、sqlcmd はエラーを無視し、バッチまたはスクリプトの実行を続行します。 既定では、エラー メッセージが出力されます。
[:]辞める
sqlcmd が終了します。
[:]EXIT [ ( ステートメント ) ]
SELECT からの戻り値として  ステートメントの結果を使用できます。 数値の場合、結果行の最終行の第 1 列は、4 バイトの (長) 整数に変換されます。 MS-DOS、Linux、および macOS は、下位バイトを親プロセスやオペレーティング システムのエラー レベルに渡します。 Windows 2000 以降のバージョンでは、4 バイト整数全体が渡されます。 構文は :EXIT(query) です。
例えば次が挙げられます。
:EXIT(SELECT @@ROWCOUNT)
バッチ ファイルの一部として、:EXIT パラメーターを含めることもできます。 たとえば、コマンド プロンプトで次のように入力します:
sqlcmd -Q ":EXIT(SELECT COUNT(*) FROM '%1')"
sqlcmd ユーティリティにより、かっこ (()) 内のすべての情報がサーバーに送信されます。 システム ストアド プロシージャで 1 つの値セットを選択し、値を返すように指定した場合、返されるのは選択した値のみです。 かっこ内に何も指定せずに :EXIT() ステートメントを指定すると、バッチ内のそのステートメントより前にあるものすべてを実行し、戻り値を返さずに終了します。
不適切なクエリを指定すると、sqlcmd は戻り値を返さずに終了します。
EXIT 形式の一覧を次に示します。
:EXITバッチを実行せずに直ちに終了し、値を返しません。
:EXIT( )バッチを実行してから終了し、値を返しません。
:EXIT(query)クエリを含むバッチを実行し、クエリの結果を返して終了します。
RAISERROR を sqlcmd スクリプトの中で使用し、状態 127 が発生すると、sqlcmd は終了し、メッセージ ID をクライアントに返します。 例えば次が挙げられます。
RAISERROR(50001, 10, 127)
このエラーにより、sqlcmd スクリプトは終了し、メッセージ ID 50001 がクライアントに返されます。
戻り値 -1 から -99 は SQL Server によって予約済みです。また、sqlcmd では次のような追加の戻り値を定義しています:
| 戻り値 | 説明 | 
|---|---|
-100 | 
戻り値を選択する前にエラーが発生しました。 | 
-101 | 
戻り値を選択するときに、行が見つからなかった。 | 
-102 | 
戻り値を選択するときに、変換エラーが発生した。 | 
GO [count]
GO は、バッチの終わりとキャッシュされた Transact-SQL ステートメントの実行を知らせます。 バッチは、個別のバッチとして複数回実行されます。 1 回のバッチで変数を複数回宣言することはできません。
その他のコマンド
:r <filename>
filename によって指定されたファイルを基に、追加の Transact-SQL ステートメントと sqlcmd コマンドを解析し、ステートメント キャッシュ内に登録します。 filename は、sqlcmd が実行されたスタートアップ ディレクトリを基準にして読み取られます。
GO が最後に記述されていない Transact-SQL ステートメントがファイルに含まれている場合は、その行の GO の後に :r を入力する必要があります。
ファイルは、バッチ ターミネータが検出された後に読み取られ、実行されます。 :r コマンドは複数発行できます。 このファイルにはバッチ ターミネータ  など、任意の GO コマンドを含めることができます。
注
対話モードで表示される行数は、:r コマンドが検出されるたびに、1 行ずつ増えます。 :r コマンドが list コマンドの出力に表示されます。
:ServerList
ローカルに構成されたサーバーと、ネットワーク上でブロードキャストしているサーバー名の一覧を表示します。
:Connect サーバー名[\インスタンス名] [-l タイムアウト] [-U ユーザー名 [-P パスワード]]
SQL Server のインスタンスに接続します。 また、現在の接続を終了します。
タイムアウト オプション:
| 価値 | 行動 | 
|---|---|
0 | 
待機状態を維持します | 
n>0 | 
n 秒間待機します | 
SQLCMDSERVER スクリプト変数により、現在のアクティブな接続が反映されます。
timeout を指定しないと、SQLCMDLOGINTIMEOUT 変数の値が既定値になります。
user_name のみを指定した場合 (オプションとして指定した場合も、環境変数として指定した場合も)、ユーザーはパスワードの入力を要求されます。 SQLCMDUSER または SQLCMDPASSWORD の環境変数が設定されている場合、ユーザーにプロンプトは表示されません。 オプションも環境変数も指定しない場合は、Windows 認証モードを使用してサインインします。 たとえば、統合セキュリティを使用して、SQL Server instance1 のインスタンス myserver に接続するには、次のコマンドを使用します:
:connect myserver\instance1
スクリプト変数を使用して myserver の既定のインスタンスに接続するには、次を使用します:
:setvar myusername test
:setvar myservername myserver
:connect $(myservername) $(myusername)
[:]!! コマンド
オペレーティング システムのコマンドを実行します。 オペレーティング システムのコマンドを実行するには、行頭に 2 つの感嘆符 (!!) を入力し、続けてオペレーティング システムのコマンドを入力します。 例えば次が挙げられます。
:!! dir
注
コマンドは sqlcmd を実行中のコンピューター上で実行されます。
:XML [ オン | オフ ]
詳細については、この記事の「XML 出力形式」と「JSON 出力形式」を参照してください。
:ヘルプ
sqlcmd コマンドと各コマンドの短い説明を一覧表示します。
sqlcmd のファイル名
sqlcmd の入力ファイルは -i オプションまたは :r コマンドで指定できます。 出力ファイルは -o オプションまたは :Error、:Out、:Perftrace コマンドで指定できます。 指定するファイルについてのガイドラインを次に示します:
:Error、:Outおよび:Perftraceでは、個別の filename の値を使用する必要があります。 同じ ファイル名 が使用されている場合は、コマンドからの入力が混在している可能性があります。ローカル コンピューターの sqlcmd からリモート サーバー上の入力ファイルが呼び出され、ファイルに
:Out c:\OutputFile.txtのようにドライブ パスが含まれていると、出力ファイルはリモート サーバーではなく、ローカル コンピューター上に作成されます。有効なファイル パスは、
C:\<filename>、\\<Server>\<Share$>\<filename>、"C:\Some Folder\<file name>"などです。 パスに空白が含まれる場合は、引用符を使用します。各新規 sqlcmd セッションにより、同じ名前の既存のファイルが上書きされます。
情報メッセージ
sqlcmd は、サーバーから送信されたすべての情報メッセージを出力します。 次の例では、Transact-SQL ステートメントが実行された後、情報メッセージが出力されます。
sqlcmd を開始します。 sqlcmd コマンド プロンプトで次のクエリを入力します:
USE AdventureWorks2022;
GO
ENTER キーを押すと、次の情報メッセージが出力されます:
Changed database context to 'AdventureWorks2022'.
Transact-SQL クエリからの出力形式
まず、sqlcmd は SELECT リストで指定した列名を含む列ヘッダーを出力します。 列名は、SQLCMDCOLSEP の文字を使用して区切られます。 既定では、この列の区切り記号はスペースです。 列名が列幅よりも短い場合は、出力は次の列まで空白で埋められます。
この行の次には区切り行が出力されます。区切り行は、連続したダッシュ文字です。 次に出力の例を示します。
sqlcmd を開始します。 sqlcmd コマンド プロンプトで次のクエリを入力します:
USE AdventureWorks2022;
SELECT TOP (2) BusinessEntityID,
               FirstName,
               LastName
FROM Person.Person;
GO
ENTER キーを押すと、次の結果セットが返されます。
BusinessEntityID FirstName    LastName
---------------- ------------ ----------
285              Syed         Abbas
293              Catherine    Abel
(2 row(s) affected)
BusinessEntityID列の幅は 4 文字のみですが、長い列名に合わせて拡張されます。 既定では、出力は 80 文字で終了します。 この幅は、-w オプションを使用するか、SQLCMDCOLWIDTH スクリプト変数を設定することで変更できます。
XML 出力形式
FOR XML 句からの結果である XML 出力は、連続するストリームでフォーマットされずに出力されます。
XML 出力を行うには、:XML ONコマンドを使用します。
注
sqlcmd は、通常の形式のエラー メッセージを返します。 エラー メッセージは XML 形式の XML テキスト ストリームでも出力されます。 :XML ONを使用すると、sqlcmd  情報メッセージは表示されません。
XML モードをオフにするには、:XML OFF コマンドを使用します。
GO コマンドは :XML OFF を行指向の出力に切り替えるので、:XML OFF コマンドの実行前に  コマンドは指定しないでください。
XML (ストリーム入力) データと行セットのデータを混在させることはできません。 XML ストリームを出力する Transact-SQL ステートメントの実行前に、:XML ON コマンドが実行されていない場合は、正しく出力されません。 :XML ON コマンドが実行されると、通常の行セットを出力する Transact-SQL ステートメントは実行できません。
注
:XML コマンドは、SET STATISTICS XML ステートメントをサポートしていません。
JSON 出力形式
JSON 出力を行うには、:XML ONコマンドを使用します。 そうでない場合、出力には、列名と JSON テキストの両方が含まれます。 この出力は、有効な JSON ではありません。
XML モードをオフにするには、:XML OFF コマンドを使用します。
詳細については、この記事の「XML 出力形式」を参照してください。
Microsoft Entra 認証を使用する
Microsoft Entra 認証の使用例:
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net  -G  -l 30
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -G -U bob@contoso.com -P MyAzureADPassword -l 30
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net  -G  -l 30
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -G -U bob@contoso.com -P MyAzureADPassword -l 30
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net  -G  -l 30
sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -G -U bob@contoso.com -P MyAzureADPassword -l 30