バッチファイルを使用したT-SQLのループ処理


目的

バッチファイルを使用したT-SQLのループ処理
指定したテーブルが存在するか確認して、存在する場合のみ処理を実行する

環境

Windows Server 2016
SQL Server 2016

準備

  • テーブル名の書かれたリストの準備
list.txt
table1
table2
table3
.
.
.

  • バッチファイルの準備

バッチフォルダにlist.txtがある前提です。

check_existence.bat
@echo off

rem 接続情報
set HOSTNAME="localhost"
set USER_ID="sa"
set PASSWPRD="PASSWORD"

rem ディレクトリ設定
set SQL="V:\script\sql\check_existence.sql
set LOG="V:\script\log\check_existence.log

rem 遅延環境変数設定
setlocal enabledelayedexpansion

rem 1行ずつ取り出しループ処理
for /f %%a in (list.txt) do (
sqlcmd -S %HOSTNAME% -U %USER_ID% -P %PASSWORD% -i %SQL% -o %LOG% -v TABLE=%%a
)
  • SQLファイルの準備
check_existence.sql
use testdb
go

-- $(TABLE)が存在する(nullではない)場合のみ動作する
if object_id('$(TABLE)') is not null
  -- 存在する場合の処理を記載
end

結果

動いてくれました。

beginを使用した方法やis nullreturnを返したりと方法はあったが、
上手く動かないことがあったので今回はこの簡単なコマンドを採用。

特に存在しない場合の処理を記載しなくても
テーブルが存在しない場合はなにもせず次のテーブルで処理をしてくれていました。
T-SQLってそういうもんなんですかね。

ログファイルは>>を使用しているので追記されます。

リストに記載されているテーブル分SQL Serverへログインしてしまうので、
そこはどうなのかなって思うところはありますけど、テーブル増えたときはリストに追加するだけなので、
運用としてはこちらのほうが楽なんですかね…。

あとがき

Oracle ばかり触っていて、SQL Server に関する知識が超スカスカだったので、少し勉強になりました。