バッチファイルを使用したT-SQLのループ処理
目的
バッチファイルを使用したT-SQLのループ処理
指定したテーブルが存在するか確認して、存在する場合のみ処理を実行する
環境
Windows Server 2016
SQL Server 2016
準備
- テーブル名の書かれたリストの準備
list.txt
table1
table2
table3
.
.
.
- バッチファイルの準備
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 null
でreturn
を返したりと方法はあったが、
上手く動かないことがあったので今回はこの簡単なコマンドを採用。
特に存在しない場合の処理を記載しなくても
テーブルが存在しない場合はなにもせず次のテーブルで処理をしてくれていました。
T-SQLってそういうもんなんですかね。
ログファイルは>>
を使用しているので追記されます。
リストに記載されているテーブル分SQL Serverへログインしてしまうので、
そこはどうなのかなって思うところはありますけど、テーブル増えたときはリストに追加するだけなので、
運用としてはこちらのほうが楽なんですかね…。
あとがき
Oracle ばかり触っていて、SQL Server に関する知識が超スカスカだったので、少し勉強になりました。
Author And Source
この問題について(バッチファイルを使用したT-SQLのループ処理), 我々は、より多くの情報をここで見つけました https://qiita.com/irohasu19/items/457b2d4afc44b2e8e1e4著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .