記事一覧

Windows向け SQLServer でSQLスクリプトを実行する

 

  
目次     



  

SQLServerでSQLスクリプトを実行する

ハロー、みなさん。エジソンです。 

今回は、SQLServerにおいて、SQLが書かれたスクリプトファイルを実行する方法を備忘録として残しておくことにします。

SQLServer 2014で検証しました。

SQLスクリプトファイルを実行してみる

ファイルが存在する場所・保存する先は、「C:\Users\username\Desktop」としています。

リスト1:sqlserver.sqlを保存
select table_name from information_schema.tables;

リスト1には、実行したいSQLを保存しましょう。select でも良いですし、insert などでもOKです。


リスト2:sqlserver.batを保存
@echo off

REM 接続先情報
set DB_INSTANCE=127.0.0.1
set DB_NAME=TEST
set USER_ID=sa
set PASSWORD=Passw0rd1234

REM スクリプト実行
osql /U %USER_ID% /P %PASSWORD% /d %DB_NAME% /S %DB_INSTANCE% /i sqlserver.sql

リスト2は、SQLServerと対話するためのプログラムである、osql の実行バッチになります。スクリプトファイルを実行するには、iオプションで、任意のファイルを指定しましょう。

osql は絶対パスである必要はありません。SQLServerをインストールすると、環境変数の Path にSQLServerプログラムのパスが通されるためです。

また、TESTカタログというDBが存在する前提や、ユーザー sa (SQLServerのルート管理者)でのログインが実行できる前提で書かれています。

さらには、DB_INSTANCEは、ホスト名とほぼ同義の概念です。既定のインスタンスとして設定されている場合は、ホスト名のみで指定できますが、既定ではない場合は、[ホスト名]\[インスタンス名] のように指定します。


リスト3:実行例
C:\Users\username\Desktop>sqlserver.bat
1> 2>  table_name                                                                                                       

 -----------------------------------------------------------------------------------------------------------------------
        ---------
 Table_1                                                                                                                


(1 行処理されました)
…

リスト3は実行例です。sqlserver.bat を実行すると、スクリプトファイルに書かれたSQLが実行されます。


SQLをまとめて実行

任意のディレクトリに配置しているスクリプトファイルをまとめて実行してみましょう。




このテクニックは、システム開発時にテーブルやデータの初期化スクリプトをまとめて実行したいような場合に役立ちます。開発途中における、DBのスキーマやマスタデータの追加は、往々にしてあるものです。


リスト4-1:scriptディレクトリにs1.sqlを保存
select table_name from information_schema.tables;

リスト4-2:scriptディレクトリにs2.sqlを保存
select table_schema from information_schema.tables;

リスト4-1と4-2に書かれたSQLに特別意味はありません。ここでは、スクリプトファイルを2つ用意したかったので、何かしらの select 文を書いてみました。


リスト5:sqlserver_loop.batを保存
@echo off
REM 接続先情報
set DB_INSTANCE=127.0.0.1
set DB_NAME=TEST
set USER_ID=sa
set PASSWORD=Passw0rd1234

set curpath=%~dp0

for %%i in ("%curpath%script\*.sql") do (
	REM スクリプト実行
	osql /U %USER_ID% /P %PASSWORD% /d %DB_NAME% /S %DB_INSTANCE% /i %%i
)

リスト5は、リスト2を少々修正したものです。forループを使用して scriptディレクトリ 以下の拡張子が sql のファイルを順次実行します。


リスト6:実行例
1> 2>  table_name                                                                                                       

 -----------------------------------------------------------------------------------------------------------------------
        ---------
 Table_1                                                                                                                


(1 行処理されました)
1> 2>  table_schema                                                                                                     

 -----------------------------------------------------------------------------------------------------------------------
        ---------
 dbo                                                                                                                    


(1 行処理されました)


リスト6は実行結果です。実行結果を見ると分かるように、複数のスクリプトファイルに書かれたSQLが実行されています。


環境依存情報は別のバッチファイルにまとめよう

プログラムを書く際の基本とも言えることですが、環境に依存する情報は別のファイルに定義しておくのがベターです。

本エントリにおける環境依存情報は、mysql のファイルパスと、DB接続情報などです。
以下のように書くとよいかと思います。

リスト7:env.batを保存
@echo off
REM 接続先情報
set DB_INSTANCE=127.0.0.1
set DB_NAME=TEST
set USER_ID=sa
set PASSWORD=Passw0rd1234

リスト8:env.batの呼び出し
@echo off

set curpath=%~dp0

call %curpath%env.bat 

REM env.batで宣言した変数を読み取ることができる
osql /U %USER_ID% /P %PASSWORD% /d %DB_NAME% /S %DB_INSTANCE% /i hoge.sql 


まとめ

osql.exe /U [ユーザーID] /P [パスワード] /d [DB名] /s [DBインスタンス] /i [スクリプトファイル]
関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp

ezolab