コマンドラインから SQL Server を制御

sqlcmd (SQL Server Command Line Tool)

sqlcmd は、 SQL Server 用のコマンドラインツールです。 SQL Server 2000 以前では osql が利用されていましたが、 SQL Server 2005 以降では sqlcmd の利用が推奨されています。*1

sqlcmd を利用して SQL を実行するには、以下のようにコマンドを入力します。

sqlcmd -E -S "[サーバ名]" -d "[データベース名]" -Q "[SQL Query]"

サーバ名とデータベース名を毎回入力するのは手間です。そこで、以下のようなコマンドを用意すると、毎回の入力が必要なくなるだけでなく、入力間違いもなくなるのでおすすめです。あらかじめ bat ファイルなどに準備し、「cmd.exe /k "sqlcmd.bat"」のように読み込んで使うと便利かもしれません。

set SQLCMD=sqlcmd -E -S "[サーバ名]" -d "[データベース名]" -Q

上記コマンドを用意している場合、以下のように入力するだけで簡単に SQL を実行できます。

%SQLCMD% "SELECT GETDATE()"

sp_attach_db (アタッチ) と sp_detach_db (デタッチ)

データベースファイル (mdf, ldf) のアタッチとデタッチには、それぞれ sp_attach_db と sp_detach_db を使います。基本的な構文は、以下のようになります。

sp_attach_db '[データベース名]','[MDF の PATH]','[LDF の PATH]'
sp_detach_db '[データベース名]'

アタッチとデタッチを使うと、データベースのバックアップを簡易的に行うことが出来ます。例えば、以下のような .bat ファイルを用意しておくと、ファイルをダブルクリックするだけで DB のバックアップが完了します。

set SQLCMD=sqlcmd -E -S "[サーバ名]" -Q

%SQLCMD% "sp_detach_db '[データベース名]'"
copy "[MDF の PATH]" "[MDF のバックアップ先]"
copy "[LDF の PATH]" "[LDF のバックアップ先]"
%SQLCMD% "sp_attach_db '[データベース名]','[MDF の PATH]','[LDF の PATH]'"

RESTORE DATABASE (データベースのリストア)

データベースのリストア (復元) を行うには、 RESTORE DATABASE を使います。基本的な構文は以下のようになります。 各引数の意味は MSDN を参照してください。*2

RESTORE DATABASE [データベース名] FROM DISK = N'[バックアップファイルの PATH]' WITH REPLACE

bcp (バルクコピー)

bcp コマンドを使うと、データを一括してインポートしたりエクスポートしたり出来ます。特に、データベースの内容を CSV 形式でエクスポートする場合によく使われます。構文の詳細については MSDN を参照してください。

以下のような内容の .bat ファイルを用意すると、ダブルクリックするだけで毎回エクスポートできるので便利です。以下の例では、データベース内のテーブルごとに tsv (タブ区切り形式) でエクスポートしています。

rem 認証方法 (-U user -P password, -T [Windows 認証])
set AUTH_TYPE=-T

bcp [データベース名].dbo.[テーブル名 1] out "[出力先 PATH 1]" -c %AUTH_TYPE% -S [サーバ名]
bcp [データベース名].dbo.[テーブル名 2] out "[出力先 PATH 2]" -c %AUTH_TYPE% -S [サーバ名]
bcp [データベース名].dbo.[テーブル名 3] out "[出力先 PATH 3]" -c %AUTH_TYPE% -S [サーバ名]
...
bcp [データベース名].dbo.[テーブル名 n] out "[出力先 PATH n]" -c %AUTH_TYPE% -S [サーバ名]

*1:sqlcmd と osql の機能を比較すると、 sqlcmd では SQL Server 2005 の機能が全て利用できるのに対し、 osql では一部利用できない機能があるようです。

*2:ここでは WITH REPLACE を使っていますが、通常の運用では使わないほうが良い可能性が高いです。 WITH REPLACE が要件に合うかは SQL Server 2005 Books Online を参照してください。