sqlcmd ユーティリティ
sqlcmd ユーティリティを使用すると、Transact-SQL ステートメント、システム プロシージャ、およびスクリプト ファイルを、コマンド プロンプト、SQLCMD モードのクエリ エディター、Windows スクリプト ファイル、または SQL Server エージェント ジョブのオペレーティング システム (Cmd.exe) ジョブ ステップで入力できます。このユーティリティでは、OLE DB を使用して Transact-SQL バッチを実行します。
重要 |
---|
SQL Server Management Studio では、クエリ エディターの標準モードと SQLCMD モードでの実行に Microsoft .NET Framework SqlClient を使用します。コマンド ラインから sqlcmd を実行する場合、sqlcmd では OLE DB プロバイダーが使用されます。同じクエリでも、SQL Server Management Studio の SQLCMD モードで実行する場合と sqlcmd ユーティリティで実行する場合とでは、適用される既定のオプションが異なるので、動作も異なる可能性があります。 |
構文
sqlcmd
[{ { -U login_id [ -P password ] } | –E trusted connection }]
[ -N encrypt connection ][ -C trust the server certificate ]
[ -z new password ] [ -Z new password and exit]
[ -S [protocol:]server[\instance_name][,port] ] [ -H wksta_name ] [ -d db_name ]
[ -l login time_out ] [ -A dedicated admin connection]
[ -i input_file ] [ -o output_file ]
[ -f < codepage > | i: < codepage > [ < , o: < codepage > ] ]
[ -u unicode output] [ -r [ 0 | 1 ] msgs to stderr ]
[ -R use client regional settings]
[ -q "cmdline query" ] [ -Q "cmdline query" and exit]
[ -e echo input ] [ -t query time_out ]
[ -I enable Quoted Identifiers ]
[ -v var = "value"...] [ -x disable variable substitution ]
[ -h headers ][ -s col_separator ] [ -w column_width ]
[ -W remove trailing spaces ]
[ -k [ 1 | 2 ] remove[replace] control characters ]
[ -y display_width ] [-Y display_width ]
[ -b on error batch abort] [ -V severitylevel ] [ -m error_level ]
[ -a packet_size ][ -c cmd_end ]
[ -L [ c ] list servers[clean output] ]
[ -p [ 1 ] print statistics[colon format]]
[ -X [ 1 ] ] disable commands, startup script, enviroment variables [and exit]
[ -? show syntax summary]
コマンド ライン オプション
ログイン関連のオプション
-Ulogin_id
ユーザーのログイン ID です。注 OSQLUSER 環境変数は旧バージョンとの互換性を維持しています。SQLCMDUSER 環境変数は OSQLUSER 環境変数よりも優先されます。これにより、sqlcmd と osql を競合することなく組み合わせて使用できます。また、既存の osql スクリプトは引き続き実行することができます。
-U オプションも -P オプションも指定しないと、sqlcmd は Microsoft Windows 認証モードを使用して接続を試みます。認証は sqlcmd を実行しているユーザーの Windows アカウントに基づきます。
-U オプションが -E オプション (このトピックの後半で説明) と同時に使用されると、エラー メッセージが生成されます。–U オプションの後に複数の引数があると、エラー メッセージが生成され、プログラムが終了します。
-Ppassword
ユーザーが指定するパスワードです。パスワードでは大文字と小文字が区別されます。-U オプションを使用して -P オプションを使用せず、SQLCMDPASSWORD 環境変数が設定されていない場合は、sqlcmd はユーザーにパスワードを要求します。また、-P オプションをコマンド プロンプトの最後にパスワードなしで使用すると、sqlcmd では既定のパスワード (NULL) が使用されます。セキュリティに関する注意 空白のパスワードは使用しないでください。強力なパスワードを使用してください。詳細については、「強力なパスワード」を参照してください。
パスワード プロンプトは、コンソールに「Password:」のようなプロンプトを出力することによって示されます。
ユーザーが行った入力は表示されません。つまり、入力時には何も表示されず、カーソルが移動しません。
SQLCMDPASSWORD 環境変数を使用して、現在のセッションに既定のパスワードを設定できます。したがって、パスワードをバッチ ファイルにハード コードする必要はありません。
次の例では、まずコマンド プロンプトで SQLCMDPASSWORD 変数を設定してから sqlcmd ユーティリティにアクセスします。コマンド プロンプトで、次のように入力します。
SET SQLCMDPASSWORD= p@a$$w0rd
セキュリティに関する注意 このとき、コンピューターのモニターにはパスワードが表示されてしまうので、注意してください。
コマンド プロンプトで、次のように入力します。
sqlcmd
ユーザー名とパスワードの組み合わせが正しくない場合は、OLE DB プロバイダーによってエラー メッセージが生成されます。
注 OSQLPASSWORD 環境変数は旧バージョンとの互換性を維持しています。SQLCMDPASSWORD 環境変数は OSQLPASSWORD 環境変数よりも優先されます。これにより、sqlcmd と osql を競合することなく組み合わせて使用でき、既存のスクリプトは引き続き機能を実行できます。
-P オプションを -E オプションと共に使用すると、エラー メッセージが生成されます。
-P オプションの後に複数の引数があると、エラー メッセージが生成され、プログラムが終了します。
-E trusted connection
ユーザー名とパスワードを使用せずにセキュリティ接続を使用して SQL Server にログオンします。既定では、-E を指定しないと、sqlcmd ではセキュリティ接続オプションが使用されます。-E オプションを使用すると、SQLCMDPASSWORD などのユーザー名とパスワード用に使用できる環境変数の設定が無視されます。-E オプションを -U オプションまたは -P オプションと共に使用すると、エラー メッセージが生成されます。
-Nencrypt connection
クライアントでこのスイッチを使用して、暗号化された接続を要求できます。このオプションは、ADO.net オプションの ENCRYPT = true と同等です。-Ctrust the server certificate
クライアントでこのスイッチを使用して、サーバーの証明書を検証せずに暗黙的に信頼するようにクライアントを構成できます。このオプションは、ADO.net オプションの TRUSTSERVERCERTIFICATE = true と同等です。-z new password
パスワードの変更:sqlcmd -U someuser -P s0mep@ssword -z a_new_p@a$$w0rd
-Z new password and exit
パスワードの変更と終了:sqlcmd -U someuser -P s0mep@ssword -Z a_new_p@a$$w0rd
-S [protocol:]server[**\instance_name][,**port]
接続先となる SQL Server のインスタンスを指定します。このオプションにより、sqlcmd スクリプト変数 SQLCMDSERVER が設定されます。サーバー コンピューター上にある SQL Server の既定のインスタンスに接続する場合は、server を指定します。サーバー コンピューター上にある SQL Server の名前付きインスタンスに接続する場合は、server[**\**instance_name] を指定します。サーバー コンピューターを指定しない場合、sqlcmd は、ローカル コンピューター上にある SQL Server の既定のインスタンスに接続します。ネットワーク上のリモート コンピューターから sqlcmd を実行するときは、このオプションが必要です。
protocol には、tcp (TCP/IP)、lpc (共有メモリ)、または np (名前付きパイプ) を設定できます。プロトコルの詳細については、「ネットワーク プロトコルの選択」を参照してください。
sqlcmd を実行するときに server[ **\**instance_name] を指定しなかった場合は、SQL Server により SQLCMDSERVER 環境変数がチェックされ、その値が使用されます。
注 OSQLSERVER 環境変数は旧バージョンとの互換性を維持しています。SQLCMDSERVER 環境変数は OSQLSERVER 環境変数よりも優先されます。これにより、sqlcmd と osql を競合することなく組み合わせて使用でき、従来のスクリプトは引き続き機能を実行することができます。
-Hwksta_name
ワークステーション名を指定します。このオプションにより、sqlcmd スクリプト変数 SQLCMDWORKSTATION が設定されます。ワークステーション名は sys.processes カタログ ビューの hostname 列に一覧表示され、ストアド プロシージャ sp_who を使用して取得できます。このオプションが指定されていない場合の既定値は、現在のコンピューター名になります。この名前は、異なる sqlcmd セッションを識別する場合に使用できます。-ddb_name
sqlcmd の開始時に USE db_name ステートメントを実行します。このオプションにより、sqlcmd スクリプト変数 SQLCMDDBNAME が設定されます。これにより初期データベースが指定されます。既定値は、ログインの既定データベースのプロパティです。データベースが存在しない場合は、エラー メッセージが生成され、sqlcmd は終了します。-llogintime_out
サーバーに接続を試みたときに、sqlcmd が OLE DB プロバイダーにログインするまでのタイムアウトを秒数で指定します。このオプションにより、sqlcmd スクリプト変数 SQLCMDLOGINTIMEOUT が設定されます。sqlcmd でのログインに関する既定のタイムアウトは 8 秒です。ログイン タイムアウトは、0 ~ 65,534 までの数値にする必要があります。指定した値が数値以外の場合、または範囲外の場合、sqlcmd はエラー メッセージを生成します。この値に 0 を指定すると、タイムアウトは無制限になります。-A dedicated admin connection
専用管理者接続 (DAC) を使用して SQL Server にログインします。この種類の接続は、サーバーのトラブルシューティングで使用されます。またこの接続は、DAC をサポートしているサーバー コンピューターでのみ機能します。DAC が使用できない場合は、sqlcmd はエラー メッセージを生成して終了します。DAC の詳細については、「専用管理者接続の使用」を参照してください。Input/Output Options
-i input_file[***,***input_file2...]
SQL ステートメントまたはストアド プロシージャのバッチを含むファイルを指定します。複数のファイルを指定すると、それらのファイルは順番に読み取られて処理されます。ファイル名とファイル名の間には空白を使用しないでください。sqlcmdにより、最初にすべての指定したファイルが存在しているかどうかがチェックされます。1 つ以上のファイルが存在していない場合は、sqlcmd は終了します。-i と -Q/-q オプションは同時に使用できません。パスの例:
-i C:\<filename>
-i \\<Server>\<Share$>\<filename>
-i "C:\Some Folder\<file name>"
空白を含むファイル パスは、引用符で囲む必要があります。
このオプションは -i input_file -i I input_file. のように複数使用できます。
-ooutput_file
sqlcmd からの出力を受信するファイルを指定します。-u が指定されている場合は、output_file は Unicode 形式で格納されます。ファイル名が無効の場合はエラー メッセージが生成され、sqlcmd が終了します。sqlcmd は、同じファイルに対する複数の sqlcmd プロセスの同時書き込みはサポートしていません。出力ファイルが破損するか、または不適切なファイルになる可能性があります。ファイル形式の詳細については、-f スイッチを参照してください。このファイルが存在しない場合は作成されます。以前の sqlcmd セッションで同じ名前のファイルが作成されていた場合は、上書きされます。ここで指定されるファイルは stdout ファイルではありません。stdout ファイルが指定されると、このファイルは使用されません。
パスの例:
-o C:\< filename>
-o \\<Server>\<Share$>\<filename>
**-o "**C:\Some Folder\<file name>"
空白を含むファイル パスは、引用符で囲む必要があります。
-f < codepage > | i: < codepage > [ <, o: < codepage > ]
入力と出力のコード ページを指定します。コード ページ番号は、インストールされた Windows コード ページを指定する数値です。詳細については、「セットアップでの照合順序の設定」を参照してください。コード ページには次の変換規則があります。
コード ページを指定しないと、入力ファイルが変換不要の Unicode ファイルでない限り、sqlcmd では、入力ファイルと出力ファイルの両方に現在のコード ページが使用されます。
sqlcmd では、ビッグ エンディアンとリトル エンディアンの両方の Unicode 入力ファイルが自動的に認識されます。-u オプションを指定すると、出力は常にリトル エンディアン Unicode になります。
出力ファイルを指定しないと、出力コード ページはコンソールのコード ページになります。その結果、コンソールに出力が正しく表示されます。
複数の入力ファイルの場合、同じコード ページが指定されているものと見なされます。Unicode 入力ファイルと Unicode 以外の入力ファイルを混在させることができます。
Cmd.exe のコード ページを確認するには、コマンド プロンプトに「chcp」と入力します。
-u unicode output
input_file の形式に関係なく、output_file を Unicode 形式で格納します。-r[ 0 | 1] msgs to stderr
エラー メッセージ出力を画面にリダイレクトします (stderr)。パラメーターを指定しない場合や、0 を指定した場合は、重大度レベル 11 以上のエラー メッセージだけがリダイレクトされます。1 を指定した場合は、PRINT を含むすべてのエラー メッセージ出力がリダイレクトされます。-o を使用しても効果はありません。既定では、メッセージは stdout に送られます。-R use client regional settings
sqlcmd により、クライアントのロケールに基づいて SQL Server から取得された数値、通貨、日付、および時刻の各列がローカライズされます。既定では、これらの列はサーバーの地域別設定を使用して表示されます。クエリ実行オプション
-q" cmdline query "
sqlcmd の起動時にクエリを実行しますが、クエリの実行が完了しても sqlcmd を終了しません。セミコロンで区切られた複数のクエリを実行できます。次の例で示すように、クエリを引用符で囲みます。コマンド プロンプトで、次のように入力します。
sqlcmd -d AdventureWorks2008R2 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2008R2 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
重要 クエリでは GO ターミネータを使用しないでください。
このオプションと共に -b を指定すると、sqlcmd はエラーで終了します。-b オプションについては、このトピックの後半で説明します。
**-Q"**cmdline query " and exit
sqlcmd の起動時にクエリを実行し、sqlcmd を即時終了します。セミコロンで区切られた複数のクエリを実行できます。次の例で示すように、クエリを引用符で囲みます。
コマンド プロンプトで、次のように入力します。
sqlcmd -d AdventureWorks2008R2 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2008R2 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
重要 クエリでは GO ターミネータを使用しないでください。
このオプションと共に -b を指定すると、sqlcmd はエラーで終了します。-b オプションについては、このトピックの後半で説明します。
-e echo input
入力スクリプトを標準出力デバイス (stdout) に書き込みます。-I enable Quoted Identifiers
SET QUOTED_IDENTIFIER 接続オプションを ON に設定します。既定では、OFF に設定されています。詳細については、「SET QUOTED_IDENTIFIER (Transact-SQL)」を参照してください。-tquerytime_out
コマンド (または SQL ステートメント) の実行待ち時間を秒単位で指定します。このオプションにより、sqlcmd スクリプト変数 SQLCMDSTATTIMEOUT が設定されます。time_out 値を指定しないと、コマンドはタイムアウトしません。querytime_out には 1 ~ 65,535 までの数値を指定する必要があります。指定した値が数値以外の場合、または範囲外の場合、sqlcmd はエラー メッセージを生成します。注 実際のタイムアウト値は、指定した time_out 値より数秒異なる場合があります。
-vvar*=value[ var=*value...]
sqlcmd スクリプトで使用できる sqlcmd スクリプト変数を作成します。値に空白が含まれる場合は、値を引用符で囲みます。複数の var="values" の値を指定できます。指定した値にエラーが生じた場合は、sqlcmd は、エラー メッセージを生成してから終了します。sqlcmd -v MyVar1=something MyVar2="some thing"
sqlcmd -v MyVar1=something -v MyVar2="some thing"
-x disable variable substitution
sqlcmd ではスクリプト変数が無視されます。これは、$(variable_name) などの通常の変数と同じ形式の文字列を含む INSERT ステートメントが、スクリプトに多数含まれている場合に便利です。書式設定のオプション
-hheaders
列ヘッダーの間に出力する行数を指定します。既定では、各クエリの結果に対して、ヘッダーは 1 つだけ表示されます。このオプションにより、sqlcmd スクリプト変数 SQLCMDHEADERS が設定されます。ヘッダーを出力しない場合は、-1 を指定します。有効でない値があると、sqlcmd はエラー メッセージを生成してから終了します。-scol_separator
列の区切り文字を指定します。既定では、空白になっています。このオプションにより、sqlcmd スクリプト変数 SQLCMDCOLSEP が設定されます。アンパサンド (&)、セミコロン (;) など、オペレーティング システムで特別な意味を持つ文字を使用する場合は、その文字を引用符 (") で囲みます。列の区切り文字には、任意の 8 ビットの文字を指定できます。-wcolumn_width
出力用の画面幅を指定します。このオプションにより、sqlcmd スクリプト変数 SQLCMDCOLWIDTH が設定されます。列幅は 8 よりも大きくかつ 65,536 よりも小さい値にする必要があります。指定した列幅が範囲外の場合、sqlcmd はエラー メッセージを生成します。既定の幅は 80 文字です。指定した列幅を超えると、出力行は次の列に折り返されます。-W remove trailing spaces
このオプションは、列から後続の空白を削除します。他のアプリケーションにエクスポートするデータを準備するときは、-s オプションと同時にこのオプションを使用します。-y または -Y オプションと共には使用できません。-k[ 1 | 2 ] remove[replace] control characters
タブ、改行文字などのすべての制御文字を出力から削除します。これにより、データが返されたときの列の形式が維持されます。1 を指定した場合、制御文字は 1 つの空白に置き換えられます。2 を指定すると、連続する制御文字が 1 つの空白に置き換えられます。-ydisplay_width
sqlcmd スクリプト変数 SQLCMDMAXFIXEDTYPEWIDTH が設定されます。長い可変長のデータ型に返される文字数を制限します。varchar(max)
nvarchar(max)
varbinary(max)
xml
UDT (user-defined data types)
text
ntext
image
注 UDT は実装によって固定長にもなります。固定長の UDT の長さが display_width よりも短い場合は、返される UDT の値は影響を受けません。ただし、display_width よりも長い場合は、出力は切り捨てられます。
display_width が 0 の場合、出力は 1 MB で切り捨てられます。出力が切り捨てられるのを防ぐ場合、:XML ON コマンドを使用できます。:XML ON コマンドについてはこのトピックの後半で説明します。
重要 返されるデータのサイズによって、サーバーとネットワークの両方に重大なパフォーマンスの問題が発生する可能性があるため、-y 0 オプションは十分注意して使用してください。
-Ydisplay_width
sqlcmd スクリプト変数 SQLCMDMAXVARTYPEWIDTH が設定されます。既定値は 256 です。次のデータ型に返される文字数を制限します。char
nchar
varchar(n)、1<n<8000 の場合
nvarchar(n)、1<n<4000 の場合
sql_variant
エラー報告のオプション
-b on error batch abort
エラーが発生したときに、sqlcmd を終了し、DOS ERRORLEVEL 値を返します。SQL Server のエラー メッセージの重大度が 10 よりも高い場合、DOS ERRORLEVEL 変数に返される値は 1 です。それ以外の場合は、0 が返されます。-V オプションが -b と共に設定されている場合、-V を使用して設定した値よりも重大度が低いときは、sqlcmd はエラーを報告しません。コマンド プロンプト バッチ ファイルにより ERRORLEVEL の値をテストすることができ、エラーを適切に処理できます。sqlcmd は重大度レベル 10 (情報メッセージ) に対してはエラーを報告しません。sqlcmd スクリプトに正しくないコメントや構文エラーが含まれている場合やスクリプト変数が不足している場合、返される ERRORLEVEL は 1 です。
-V severitylevel
ERRORLEVEL 変数を設定するために使用される重大度レベルを制御します。重大度レベルがこの値以下のエラー メッセージによって、ERRORLEVEL が設定されます。0 より小さい値は 0 と報告されます。バッチ ファイルおよび CMD ファイルを使用して、ERRORLEVEL 変数の値をテストできます。-merror_level
stdout に送信されるエラー メッセージを制御します。重大度レベルがこのレベル以下のメッセージが送信されます。この値を -1 に設定すると、情報メッセージを含めすべてのメッセージが送信されます。-m と -1 の間にスペースは使用できません。たとえば、-m-1 は有効ですが、-m-1 は無効です。このオプションにより、sqlcmd スクリプト変数 SQLCMDERRORLEVEL も設定されます。この変数の既定値は 0 です。
その他のオプション
-apacket_size
異なるサイズのパケットを要求します。このオプションにより、sqlcmd スクリプト変数 SQLCMDPACKETSIZE が設定されます。packet_size は 512 ~ 32,767 までの値にする必要があります。既定値は 4096 です。大きなパケット サイズを指定すると、GO コマンド間に多数の SQL ステートメントが含まれているスクリプトの実行パフォーマンスが向上します。既定値よりも大きいパケット サイズを要求できます。ただし、要求が拒否された場合、sqlcmd はサーバーの既定のパケット サイズを使用します。-ccmd_end
バッチ ターミネータを指定します。既定では、"GO" だけが入力されている行があると、コマンドが終了したと見なされ、SQL Server に送られます。バッチ ターミネータをリセットする場合、Transact-SQL の予約キーワードやオペレーティング システムで特別な意味を持つ文字は、先頭に円記号が付いているかどうかに関係なく、使用しないでください。-L [ c ] list servers[clean output]
ローカルに構成されたサーバー コンピューターと、ネットワーク上でブロードキャストしているサーバー コンピューター名の一覧を表示します。このパラメーターは、他のパラメーターと組み合わせて使用することはできません。一覧表示できるサーバー コンピューターの最大数は 3,000 です。バッファーのサイズが原因でサーバーの一覧が切り捨てられる場合は、警告メッセージが表示されます。注 ネットワーク上のブロードキャストの特性によっては、sqlcmd は、一部のサーバーからタイムリーな応答を受信できない場合があります。そのため、返されるサーバーのリストは、このオプションの実行ごとに異なる可能性があります。
省略可能なパラメーター c を指定すると、出力結果には Servers: ヘッダー行が含まれません。このため、各サーバー行は、先頭に空白がない状態で一覧表示されます。これは、クリーン アウトプットとも呼ばれます。クリーン アウトプットを使用すると、スクリプト言語の処理パフォーマンスが向上します。
-p[ 1 ] print statistics[colon format]
すべての結果セットのパフォーマンス統計を出力します。次は、パフォーマンス統計の形式の例です。Network packet size (bytes): n
x xact[s]:
Clock Time (ms.): total t1 avg t2 (t3 xacts per sec.)
指定項目 :
x = SQL Server によって処理されるトランザクション数、
t1 = すべてのトランザクションにかかる合計時間、
t2 = 単一のトランザクションにかかる平均時間、
t3 = 1 秒あたりの平均トランザクション数を表します。
すべての時間はミリ秒単位です。
省略可能なパラメーター 1 を指定した場合は、統計の出力形式は、スプレッドシートへ容易にインポートできる、またはスクリプトによって処理できる、コロンで区切られた形式となります。
省略可能なパラメーターが 1 以外の値の場合は、エラーが生成され、sqlcmd は終了します。
-X [ 1 ] disable commands, startup script, enviroment variables [and exit]
sqlcmd がバッチ ファイルから実行される場合に、システムのセキュリティを損なう可能性のあるコマンドを無効にします。無効なコマンドも認識されます。sqlcmd は警告メッセージを表示して継続します。省略可能なパラメーターを 1 に指定すると、sqlcmd はエラー メッセージを生成して終了します。-X オプションを使用した場合に無効になるコマンドは次のとおりです。ED
**!!**command
-X オプションを指定すると、環境変数が sqlcmd に渡されなくなります。また、SQLCMDINI スクリプト変数を使用して指定した、スタートアップ スクリプトも実行できなくなります。sqlcmd スクリプト変数の詳細については、「sqlcmd でのスクリプト変数の使用」を参照してください。
-? show syntax summary
sqlcmd オプションの構文の概要を表示します。
説明
オプションは、構文の例に示されている順序に従って使用する必要はありません。
複数の結果が返される場合は、sqlcmd は同じバッチの各結果セットの間に空白行を 1 行ずつ出力します。また、"<x> 件処理されました" というメッセージは、そのメッセージが実行したステートメントに該当する場合にのみ表示されます。
sqlcmd を対話的に使用するには、コマンド プロンプトで、sqlcmd を前に説明した各オプションと共に入力します。詳細については、「sqlcmd ユーティリティの使用」を参照してください。
注 |
---|
-L、-Q、-Z、または -i のオプションを使用すると、sqlcmd は実行後に終了します。 |
コマンド環境 (Cmd.exe) での sqlcmd コマンド ライン全体の長さは、すべての引数と拡張変数を含めて、オペレーティング システムの Cmd.exe によって決まります。
変数の優先順位 (低から高)
システム レベル環境変数
ユーザー レベル環境変数
sqlcmd の実行前にコマンド プロンプトで行ったコマンド シェル (SET X=Y) の設定
sqlcmd-v X=Y
:Setvar X Y
注 |
---|
環境変数を表示するには、[コントロール パネル] の [システム] アイコンを開き、[詳細設定] タブをクリックします。 |
sqlcmd スクリプト変数
変数 |
関連スイッチ |
R/W |
既定値 |
---|---|---|---|
SQLCMDUSER |
-U |
R |
"" |
SQLCMDPASSWORD |
-P |
-- |
"" |
SQLCMDSERVER |
-S |
R |
"DefaultLocalInstance" |
SQLCMDWORKSTATION |
-H |
R |
"ComputerName" |
SQLCMDDBNAME |
-d |
R |
"" |
SQLCMDLOGINTIMEOUT |
-l |
R/W |
"8" (秒) |
SQLCMDSTATTIMEOUT |
-t |
R/W |
"0" = 無制限に待機 |
SQLCMDHEADERS |
-h |
R/W |
"0" |
SQLCMDCOLSEP |
-s |
R/W |
" " |
SQLCMDCOLWIDTH |
-w |
R/W |
"0" |
SQLCMDPACKETSIZE |
-a |
R |
"4096" |
SQLCMDERRORLEVEL |
-m |
R/W |
0 |
SQLCMDMAXVARTYPEWIDTH |
-y |
R/W |
"256" |
SQLCMDMAXFIXEDTYPEWIDTH |
-Y |
R/W |
"0" = 無制限 |
SQLCMDEDITOR |
R/W |
"edit.com" |
|
SQLCMDINI |
R |
"" |
SQLCMDUSER、SQLCMDPASSWORD および SQLCMDSERVER は、
:Connect が使用されているときに設定されます。
R は、その値がプログラムの初期化時に一度だけ設定できることを示します。
R/W は、setvar コマンドを使用して値を変更できること、および後続のコマンドに新しい値が反映されることを示します。
sqlcmd コマンド
sqlcmd では、Transact-SQL ステートメントのほかに次のコマンドも使用できます。
GO [count] |
:List |
[:] RESET |
:Error |
[:] ED |
:Out |
[:] !! |
:Perftrace |
[:] QUIT |
:Connect |
[:] EXIT |
:On Error |
:r |
:Help |
:ServerList |
:XML [ON | OFF] |
:Setvar |
:Listvar |
sqlcmd コマンドを使用するときは、次の点に注意してください。
GO を除くすべての sqlcmd コマンドは、コロン (:) によってプレフィックス指定する必要があります。
重要 既存の osql スクリプトとの互換性を保つために、一部のコマンドはコロンなしで認識されます。これは、[:] によって示されています。
sqlcmd コマンドが認識されるのは、コマンドが行の先頭にある場合のみです。
すべての sqlcmd コマンドには、大文字と小文字の区別はありません。
各コマンドは個別の行に指定する必要があります。コマンドの後には、Transact-SQL ステートメントまたは別のコマンドを指定できません。
コマンドは即座に実行されます。Transact-SQL ステートメントのように、実行バッファーに配置されません。
編集コマンド
[:] ED
テキスト エディターを開始します。このエディターは、現在の Transact-SQL バッチまたは最後に実行したバッチを編集する場合に使用できます。最後に実行したバッチを編集するには、最後のバッチの実行が完了した直後に ED コマンドを入力する必要があります。テキスト エディターは、SQLCMDEDITOR 環境変数で定義したエディターです。既定のエディターは "Edit" です。エディターを変更するには、SQLCMDEDITOR 環境変数を設定します。たとえば、エディターを Microsoft メモ帳に設定するには、コマンド プロンプトで次のように入力します。
SET SQLCMDEDITOR=notepad
[:] RESET
ステートメント キャッシュをクリアします。:List
ステートメント キャッシュの内容を出力します。変数
:Setvar <var> [ "value" ]
sqlcmd スクリプト変数を定義します。スクリプト変数は $(VARNAME) という形式になります。変数名では大文字と小文字が区別されません。
スクリプト変数は次の方法で指定できます。
コマンド ラインのオプションを暗黙的に使用します。たとえば、-l オプションでは SQLCMDLOGINTIMEOUT という sqlcmd 変数が設定されます。
:Setvar コマンドを明示的に使用します。
sqlcmd の実行前に環境変数を定義します。
注 -X オプションを使用すると、環境変数が sqlcmd に渡されなくなります。
:Setvar を使って定義した変数と環境変数が同じ名前の場合は、:Setvar を使用して定義した変数が優先されます。
変数名には空白文字を含めることはできません。
また変数名には、$ (var) のような変数表現と同じ形式を使用することはできません。
スクリプト変数の文字列値に空白文字が含まれる場合は、値を引用符で囲みます。スクリプト変数の値を設定していない場合は、そのスクリプト変数は削除されます。
:Listvar
現在設定されているスクリプト変数の一覧を表示します。注 sqlcmd によって設定されたスクリプト変数および :Setvar コマンドを使用して設定されたスクリプト変数のみが表示されます。
出力コマンド
:Error **<filename>|STDERR|STDOUT
すべてのエラー出力を、file name によって指定されたファイル、または stderr や stdout にリダイレクトします。Error コマンドは、スクリプト内で複数回使用できます。既定では、エラー出力は stderr に送られます。file name
出力を受信するファイルを作成して開きます。ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。権限またはその他の理由でファイルが使用できない場合は、出力は切り替えられず、最後に指定した出力先または既定の出力先に送信されます。STDERR
エラー出力を stderr ストリームに切り替えます。ストリームがリダイレクトされている場合は、ストリームがリダイレクトされた対象がエラー出力を受信します。STDOUT
エラー出力を stdout ストリームに切り替えます。ストリームがリダイレクトされている場合は、ストリームがリダイレクトされた対象がエラー出力を受信します。
:Out <filename>| STDERR| STDOUT
すべてのクエリ結果を、file name によって指定されたファイル、または stderr や stdout に作成してリダイレクトします。既定では、出力は stdout に送られます。ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。Out コマンドは、スクリプト内で複数回使用できます。:Perftrace <filename>| STDERR| STDOUT
すべてのパフォーマンス トレース情報を、file name によって指定されたファイル、または stderr や stdout に作成してリダイレクトします。既定では、パフォーマンス トレース出力は stdout に送られます。ファイルが既に存在している場合は、ファイルは 0 バイトに切り詰められます。Perftrace コマンドは、スクリプト内で複数回使用できます。実行制御コマンド
:On Error[ exit| ignore]
スクリプト実行中またはバッチ実行中のエラー発生時に対応するアクションを設定します。exitオプションを使用すると、sqlcmd は該当するエラー値を表示して終了します。
ignore オプションを使用すると、sqlcmd はエラーを無視し、バッチまたはスクリプトの実行を続行します。既定では、エラー メッセージが出力されます。
[:] QUIT
sqlcmd が終了します。[:] EXIT[ (statement) ]
sqlcmd からの戻り値に、SELECT ステートメントの結果を使用できます。数値の場合、結果行の最終行の第 1 列は、4 バイトの (長) 整数に変換されます。MS-DOS は、下位バイトを親プロセスやオペレーティング システムのエラー レベルに渡します。Windows 200x では、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 ステートメントの実行を知らせます。count の値を指定すると、キャッシュされたステートメントが 1 つのバッチとして count の回数実行されます。その他のコマンド
:r <filename>
<filename>* * によって指定されたファイルを基に、追加の Transact-SQL ステートメントと sqlcmd コマンドを解析し、ステートメント キャッシュ内に登録します。GO が最後に記述されていない Transact-SQL ステートメントがファイルに含まれている場合は、その行の :r の後に GO を入力する必要があります。
注 <filename> は、sqlcmd が実行されたスタートアップ ディレクトリと関連して読み取られます。
ファイルは、バッチ ターミネータが検出された後に読み取られ、実行されます。:r コマンドは複数発行できます。ファイルには、どのような sqlcmd コマンドでも含めることができます。これには、バッチ ターミネータの GO も含まれます。
注 対話モードで表示される行数は、:r コマンドが検出されるたびに、1 行ずつ増えます。:r コマンドは、リスト コマンドの出力に表示されます。
:ServerList
ローカルに構成されたサーバーと、ネットワーク上でブロードキャストしているサーバー名の一覧を表示します。:Connect server_name[**\**instance_name] [-l timeout] [-U user_name [-P password]]
SQL Server のインスタンスに接続します。また、現在の接続を終了します。タイムアウト オプション :
0
待機状態を維持
n>0
n 秒間待機
SQLCMDSERVER スクリプト変数により、現在のアクティブな接続が反映されます。
timeout を指定しないと、SQLCMDLOGINTIMEOUT 変数の値が既定値になります。
user_name のみを指定した場合 (オプションとして指定した場合も、環境変数として指定した場合も)、ユーザーはパスワードの入力を要求されます。SQLCMDUSER 環境変数または SQLCMDPASSWORD 環境変数が設定されている場合は、この限りではありません。オプションも環境変数も提供されない場合は、Windows 認証モードを使用してログインします。たとえば、統合セキュリティを使用して、myserver である SQL Server のインスタンス instance1 に接続するには、次を使用します。
:connect myserver\instance1
スクリプト変数を使用して myserver の既定のインスタンスに接続するには、次を使用します。
:setvar myusername test
:setvar myservername myserver
:connect $(myservername) $(myusername)
[:] !!< command>
オペレーティング システムのコマンドを実行します。オペレーティング システムのコマンドを実行するには、行頭に 2 つの感嘆符 (!!) を入力し、続けてオペレーティング システムのコマンドを入力します。次にその例を示します。:!! Dir
注 コマンドは sqlcmd を実行中のコンピューター上で実行されます。
:XML [ON | OFF]
詳細については、このトピックの「XML 出力形式」を参照してください。:Help
sqlcmd コマンドと各コマンドの短い説明を一覧表示します。
sqlcmd のファイル名
sqlcmd の入力ファイルは -i オプションまたは :r コマンドで指定できます。出力ファイルは -o オプションまたは :Error、:Out、および :Perftrace コマンドで指定できます。指定するファイルについてのガイドラインを次に示します。
:Error、:Out および :Perftrace を指定するときは、個別に <filename> を指定します。同じ <filename> を使用すると、各コマンドからの入力が混在する場合があります。
ローカル コンピューターの sqlcmd からリモート サーバー上の入力ファイルが呼び出され、ファイルに :out c:\OutputFile.txt のようにドライブ パスが含まれていると、出力ファイルはリモート サーバーではなく、ローカル コンピューター上に作成されます。
有効なファイル パスには、C:\<filename>、\\<Server>\<Share$>\<filename> や "C:\Some Folder\<file name>" などがあります。パスに空白が含まれる場合は、引用符を使用します。
各新規 sqlcmd セッションは同じ名前の既存のファイルを上書きします。
情報メッセージ
sqlcmd は、サーバーから送信されたすべての情報メッセージを出力します。次の例では、Transact-SQL ステートメントが実行された後、情報メッセージが出力されます。
コマンド プロンプトで次のように入力します。
sqlcmd
At the sqlcmd prompt type:
USE AdventureWorks2008R2;
GO
Enter キーを押すと、"データベース コンテキストが 'AdventureWorks2008R2' に変更されました。" という情報メッセージが出力されます。
Transact-SQL クエリからの出力形式
まず、sqlcmd は SELECT リストで指定した列名を含む列ヘッダーを出力します。列名は、SQLCMDCOLSEP で指定された文字を使用して分割されます。既定では、空白です。列名が列幅よりも短い場合は、出力は次の列まで空白で埋められます。
この行の次には区切り行が出力されます。区切り行は、連続したダッシュ文字です。次に出力の例を示します。
sqlcmd を起動します。sqlcmd コマンド プロンプトで次のように入力します。
USE AdventureWorks2008R2;
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 コマンドを使用します。
XML OFF コマンドは sqlcmd を行指向の出力に切り替えるので、XML OFF コマンドの実行前に GO コマンドは指定しないでください。
XML (ストリーム入力) データと行セットのデータは、混在することはできません。XML ストリームを出力する Transact-SQL ステートメントの実行前に、XML ON コマンドが実行されていない場合は、正しく出力されません。XML ON コマンドが実行されている場合は、通常の行セットを出力する Transact-SQL ステートメントは実行できません。
注 |
---|
:XML コマンドは SET STATISTICS XML ステートメントをサポートしません。 |
sqlcmd のベスト プラクティス
次の説明を参考にして、セキュリティと効率を最大にしてください。
統合セキュリティを使用します。
自動化された環境では -X を使用します。
適切な NTFS ファイル システム権限を使用して、入力ファイルと出力ファイルのセキュリティを保護します。
パフォーマンスを向上させるには、複数のセッションではなく、1 つの sqlcmd セッションの中で、できるだけ作業するようにします。
バッチまたはクエリ実行のタイムアウト値を、推定所要時間よりも長めに設定します。