SQLCMD の使い方

この記事は、2016 年 5 月 23 日 に Data Platform Tech Sales Team Blog にて公開された内容です。

 

Microsoft Japan Data Platform Tech Sales Team

中川

SQL Server への操作には、GUI 含め操作性がよく、かつ多機能な SQL Server Management Studio ( SSMS ) を使用するケースが多いかと思いますが、SQLCMDを使うと実運用や検証などで有効な汎用性の高いスクリプトを作成・実行することが可能になります。

SQLCMD とは Transact-SQL ステートメントやスクリプトファイルを実行するためのコマンドラインユーティリティで、 OSQL や ISQL の後継として SQL Server 2005 から提供が開始されました。基本的な使い方 ( SQL Server  への接続方法など ) は Web 上でも纏めておられる方もいたりと情報が纏まっておりますので、本投稿では、あまり皆様に知られていない効率よいスクリプト作成などに有用な SQLCMD の機能について触れたいと思います。

因みに余談ですが、SQL Server への接続には ODBC ドライバーを利用しています。( ※ SSMS は接続に Microsoft .NET Framework SqlClient を利用しています。)

では早速、いくつかの機能についてご紹介いたします。

 

[SQL の実行 (SQL を直接指定)]

-q あるいは –Q オプション

SQL を引数部分に直接指定して実行でき、セミコロンで区切られた複数の SQL も実行できます

例) image

-q SQL が完了しても SQLCMD を終了しない
-Q SQL が完了すると SQLCMD も終了する

(補足)

指定する SQL 内で GO コマンド(後述)は使用できません

 

[SQL の実行 (ファイルを読み込んで実行)]

-i オプション

ファイルを読み込んで実行でき、カンマ区切りでファイル名を列挙することにより、複数ファイルの読み込みもできます

例) test.sql を読み込んで実行 image

例) test1.sql,test2.sql を読み込んで実行 image

(補足)

複数ファイルを読み込んで実行する場合、GO コマンド(後述)を記載していなくてもファイル毎のバッチ扱いとなります。つまり、上記例ではtest1.sql と test2.sql の内容をバッファ上で連結した上で一つのバッチとして SQL Server 側に送られるのではなく、ファイル毎のバッチ扱いとなります。

-i オプションで複数ファイル指定時には、1 セッションにて複数ファイルを順番にシリアルで実行されます。(並列で複数ファイルの内容が実行されるわけではありません)

 

[変数の指定]

-v オプション

変数を指定できます。複数の変数を指定する際には空白で列挙するか、変数ごとに –v オプションを指定します。

例) test.sql (変数を使用した SQL ) を読み込んで変数を実行時に指定し実行 image image

環境変数にて変数を指定することもできます image

 

[読み込むファイルの中で更にファイルを読み込む]

:r コマンド

sqlcmd コマンドの一つで、ファイルを読み込むことができます

例) image

 

[出力フォーマットの指定]

-y オプション

次のデータ型に返される文字数を制御する sqlcmd スクリプト変数 SQLCMDMAXVARTYPEWIDTH が設定されます。既定値は 256 です。

varchar(max) UDT (user-defined data types)
nvarchar(max) text
varbinary(max) ntext
xml image

例) image image

-Y オプション

次のデータ型に返される文字数を制御する sqlcmd スクリプト変数 SQLCMDMAXFIXEDTYPEWIDTH が設定されます。既定値は 0 (無制限) です。

char( n )、1<=n<=8000 の場合 nvarchar( n )、1<=n<=4000 の場合
nchar( n )、1<=n<=4000 の場合 varbinary( n )、1<=n<=4000 の場合
varchar( n )、1<=n<=8000 の場合 variant

例) image image

-w オプション

出力画面幅を制御する sqlcmd スクリプト変数 SQLCMDCOLWIDTH が設定されます。既定値は 80 です。  8 よりも大きくかつ 65,536 よりも小さい値にする必要があります。なお、指定した列幅を超えると、出力行は次の列に折り返されます。

例) image image

–R オプション

sqlcmd により、クライアントのロケールに基づいて SQL Server から取得された数値、通貨、日付、および時刻の各列がローカライズされます。本オプションを指定しない場合には、これらの列はサーバーの地域別設定を使用して表示されます。

–h オプション

列ヘッダーの間に出力する行数を制御する sqlcmd スクリプト変数 SQLCMDHEADERS が設定されます。 本オプションを指定しない場合には、各クエリの結果に対して、ヘッダーは 1 つだけ表示されます。-1 を指定した場合、ヘッダーは出力されません。

 

[Appendix]

GO コマンド

  • Transact-SQL ステートメントではなく、sqlcmd および osql ユーティリティと SSMS コード エディターで認識されるコマンドです
  • Transact-SQL ステートメントのバッチの終了を SQL Server ユーティリティに通知するコマンドです
  • GO はバッチの終了(そこまでが一つの処理)を指定するものであり、バッチ内のステートメントは、1 つの実行プランにコンパイルされます
  • ローカル (ユーザー定義) 変数のスコープはバッチ内に限られ、GO コマンドの後では参照できません
  • GO の後ろに数値を指定することにより、バッチを指定回数繰り返し実行できます

例) image

  • ①、②、③が それぞれ独立したバッチとなります。つまり、① で定義したローカル変数は ② のバッチで使用できません。
  • ② のバッチは変数が定義されていないというエラーとなります
  • ③ のバッチを 10 回繰り返し実行します

 

以上、今回は地味な内容ではありますが SQLCMD の便利な機能についていくつかご紹介させていただきました。

運用や検証などの作業効率化に少しでもお役に立てれば幸いです。

 

おすすめ記事