【バッチスクリプト/SQL Server】バッチ処理でテーブルデータの全件洗い替え


いつもお世話になっております。
RfromLです。

今回はテーブルのデータを全件洗い替えするバッチスクリプトについてです。

1.はじめに

今回はテーブルのデータを全件洗い替えするバッチスクリプトについてです。

実例として、以前投稿した以下の記事で作成した3つのバッチスクリプトを流用して、一つのバッチスクリプトにします。

【バッチスクリプト/SQL Server】テーブルエクスポ-ト処理バッチ
【バッチスクリプト/SQL Server】テーブルトランケート処理バッチ
【バッチスクリプト/SQL Server】テーブルインポート処理バッチ

イメージとしては以下の処理を行うバッチスクリプトとなります。

エクスポート~トランケート~インポートまでを1バッチにする意味としては、インポートの実行前にエクスポートをしておくことで、テーブルデータ入れ替え前にテーブル上にあったデータをバックアップしておくことができます。


2.環境情報

今回の手順作成実施で使用した環境は以下のバージョンとなっています。

OSWindows11 Home 64ビット
DBMSSQL Server 2019
統合環境SQL Server Management Studio v18.10
BCP15.0.2000.5

3.作成スクリプト

3-1.コード内容

今回作成したスクリプトファイルのコード内容は以下の通りです。

[ 価格情報_AllRefresh.bat ]

@REM ------------------------------------------------------------
@REM 初期処理
@REM ------------------------------------------------------------
@REM 実行バッチファイルディレクトリ設定
SET CMD_PATH=%~dp0

@REM 処理ID設定(バッチファイル名)
SET BATCH_ID=%~n0

@REM ログファイルディレクトリ設定
SET LOGDIR=%CMD_PATH%\log

@REM ログファイル設定
SET LOGFILE=%LOGDIR%\%BATCH_ID%.%DATE:~8,2%.log

@REM DBアンロードファイル格納ディレクトリ
SET UDBDIR=%CMD_PATH%\unload

@REM DBロードファイル格納ディレクトリ
SET LDBDIR=%CMD_PATH%\load

@REM ------------------------------------------------------------
@REM SQL Server ログイン情報設定
@REM ------------------------------------------------------------
SET ONR=dbo
SET DB=※データベース名
SET SVR=※サーバー名
SET USR=※ユーザー名
SET PWD=※パスワード

@REM ------------------------------------------------------------
@REM 処理開始メッセージ
@REM ------------------------------------------------------------
@REM 処理開始ログ
CALL :TIMEGET
ECHO %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 処理開始
ECHO %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 処理開始 >> %LOGFILE%

@REM ------------------------------------------------------------
@REM BCP : 価格情報テーブル アンロード処理
@REM ------------------------------------------------------------
SET PROCNAME=価格情報テーブル アンロード処理

SET TBL=価格情報
SET ULOADFILE=価格情報_unload_%DATETIME%.txt

ECHO %PROCNAME% 開始
ECHO %PROCNAME% 開始 >> %LOGFILE%

BCP %DB%.%ONR%.%TBL% OUT %UDBDIR%\%ULOADFILE% -c -t , -r \n -S %SVR% -U %USR% -P %PWD% >> %LOGFILE%
IF NOT %ERRORLEVEL% == 0 GOTO ABEND

ECHO %PROCNAME% 終了
ECHO.
ECHO %PROCNAME% 終了 >> %LOGFILE%
ECHO.>> %LOGFILE%

@REM ------------------------------------------------------------
@REM SQLCMD : 価格情報テーブル トランケート処理
@REM ------------------------------------------------------------
SET PROCNAME=価格情報テーブル トランケート処理

ECHO %PROCNAME% 開始
ECHO %PROCNAME% 開始 >> %LOGFILE%

SQLCMD -S %SVR% -d %DB% -U %USR% -P %PWD% -Q "truncate table 価格情報" -e -b >> %LOGFILE%
IF NOT %ERRORLEVEL% == 0 GOTO ABEND

ECHO %PROCNAME% 終了
ECHO.
ECHO %PROCNAME% 終了 >> %LOGFILE%
ECHO.>> %LOGFILE%

@REM ------------------------------------------------------------
@REM BCP : 価格情報テーブル ロード処理
@REM ------------------------------------------------------------
SET PROCNAME=価格情報テーブル ロード処理

SET TBL=価格情報
SET LOADFILE=価格情報_load.txt

ECHO %PROCNAME% 開始
ECHO %PROCNAME% 開始 >> %LOGFILE%

BCP %DB%.%ONR%.%TBL% IN %LDBDIR%\%LOADFILE% -c -t , -r \n -S %SVR% -U %USR% -P %PWD% >> %LOGFILE%
IF NOT %ERRORLEVEL% == 0 GOTO ABEND

ECHO %PROCNAME% 終了
ECHO.
ECHO %PROCNAME% 終了 >> %LOGFILE%
ECHO.>> %LOGFILE%

@REM ------------------------------------------------------------
@REM 正常終了処理
@REM ------------------------------------------------------------
:END
CALL :TIMEGET
ECHO %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 正常終了
ECHO %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 正常終了 >> %LOGFILE%
ECHO.>> %LOGFILE%

EXIT /B 0

@REM ------------------------------------------------------------
@REM 異常終了処理
@REM ------------------------------------------------------------
:ABEND

@REM エラー発生処理名出力
ECHO エラー発生処理名:%PROCNAME%
ECHO エラー発生処理名:%PROCNAME% >> %LOGFILE%

@REM エラーコード出力
ECHO エラーコード:%ERRORLEVEL%
ECHO エラーコード:%ERRORLEVEL% >> %LOGFILE%

CALL :TIMEGET
ECHO %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 異常終了
ECHO %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 異常終了 >> %LOGFILE%
ECHO.>> %LOGFILE%

EXIT /B 9

@REM ------------------------------------------------------------
@REM 日時情報取得サブルーチン
@REM ------------------------------------------------------------
:TIMEGET

@REM システム日付取得(YYYY=年,MM=月,DD=日,WK=曜日)
SET YYYY=%DATE:~0,4%
SET MM=%DATE:~5,2%
SET DD=%DATE:~8,2%
SET WK=%DATE:~0,1%

@REM システム時刻取得(HH=時)
@REM ※HH部分(時間部分)の1文字目をチェックして
@REM   空白の場合は頭ゼロ埋めでセット
SET HHCHK=%TIME:~0,1%

IF "%HHCHK%"==" " (
  SET HH=0%TIME:~1,1%
) ELSE (
  SET HH=%TIME:~0,2%
)

@REM システム時刻取得(MI=分,SS=秒)
SET MI=%TIME:~3,2%
SET SS=%TIME:~6,2%

SET DATETIME="%YYYY%%MM%%DD%_%HH%%MI%%SS%"

※SQL Server ログイン情報設定の以下項目はマスキングしています。
・データベース名
・サーバー名
・ユーザー名
・パスワード

3-2.ディレクトリ構成

作成したバッチスクリプトを実行する際のディレクトリ・ファイル構成です。
今回実行するバッチスクリプトは「価格情報_AllRefresh.bat」です。

3-3.価格情報テーブル

バッチスクリプトが使用するテーブルの情報です。

■テーブルレイアウト

No項目名NULLKEY
1銘柄コードchar4NG1
2価格numeric9NG
3利回りnumeric5NG
4NAVnumeric9NG
5NAV倍率numeric5NG
6時価総額numeric9NG
7出来高numeric9NG
8基準年月日char8NG2

■テーブルデータ

銘柄コード価格利回り1口NAVNAV倍率時価総額出来高基準年月日
8991992005.401232680.8046336188520250327
89921545003.421288711.2010531041720250327
99971180005.551234950.9641532105120250327
99981167005.611234950.9441075158520250327
9999993005.401232680.8146383334420250327

3-4.価格情報テーブルインポートファイル

テストに使用するインポートファイルのデータ内容です。

■価格情報テーブルデータファイル

銘柄コード価格利回り1口NAVNAV倍率時価総額出来高基準年月日
99971180005.551234950.9641532105120250328
99981167005.611234950.9441075158520250328
9999993005.401232680.8146383334420250328

区切り文字:,(カンマ)
改行コード:CRLF
文字コード:S-JIS

3-5.機能説明

①開始処理
・処理開始メッセージを以下の書式で標準出力に出力する。
「スクリプトID YYYY年MM月DD日 hh時mm分ss秒 処理開始」


②価格情報テーブル アンロード処理
・BCPコマンドで価格情報テーブルをアンロードする処理を実行する。
・ERRORLEVELを判定処理
ステータスが0の場合、正常終了処理を行う。
ステータスが0以外の場合、異常終了処理を行う。


③価格情報テーブル トランケート処理
・SQLコマンドで価格情報テーブルをトランケートする処理を実行する。
・ERRORLEVELを判定処理
ステータスが0の場合、正常終了処理を行う。
ステータスが0以外の場合、異常終了処理を行う。


④価格情報テーブル ロード処理
・BCPコマンドで価格情報テーブルをロードする処理を実行する。
・ERRORLEVELを判定処理
ステータスが0の場合、正常終了処理を行う。
ステータスが0以外の場合、異常終了処理を行う。


⑤正常終了処理
・正常終了メッセージを以下の書式で標準出力し処理を終了する。
「スクリプトID YYYY年MM月DD日 hh時mm分ss秒 正常終了」


⑥異常終了処理
・異常終了メッセージを以下の書式で標準出力し処理を終了する。
「スクリプトID YYYY年MM月DD日 hh時mm分ss秒 異常終了」


4.実行結果確認

実行結果確認は稼働確認として正常処理、異常処理の以下2パターンを行います。

①正常終了確認(入力ファイル有件、テーブルデータ有件)
②異常終了確認(入力ファイル非存在)

4-1.正常終了確認(入力ファイル有件、テーブルデータ有件)

①テーブルにデータが登録されていることを確認

②インポートするデータファイルが有件であることを確認

③バッチスクリプトを実行

④ログファイルを確認し、処理が正常終了していることを確認

⑤エクスポートファイルを確認し、テーブルに登録されていたデータが出力されていることを確認

⑥インポート先のテーブルデータが3件に変わっていることを確認

4-2.異常終了確認(入力ファイル非存在)

①インポートするファイルが存在しないことを確認

②インポート対象テーブル「価格情報」テーブルにデータが存在することを確認

③バッチスクリプト「SequentialRun.bat」を実行

④ログファイルを確認し、「価格情報_LOAD.bat」のみ処理が異常終了していることを確認

⑤インポート対象のテーブルがトランケート処理までは行われ0件になっていることを確認

5.おわりに

テーブルデータの更新には大きく2種類。差分更新、全件洗い替え(全件入れ替え)があります。

全件洗い替えの場合は、テーブルデータを事前に削除しておく必要があるので、インポート前にトランケートを行います。また、トランケート前にエクスポートをしておくことで、処理前の状態をファイルとしてバックアップしておけます。

インポートするデータが処理の仕様上かならずKEY項目の一致しない差分インポートの場合は、トランケートの実行は不要です。

以上です。
宜しくお願い致します。


タイトルとURLをコピーしました