命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術についてのメモ。

BCPコマンドで同一構造のサーバーのテーブルを比較する。

作ったのでメモ。

経緯

DBサーバーを入れ替える時、全データが入替えられているか確認する作業があったのですが、
「SSMSでSelectして目視比較して・・・」みたいな話が持ち上がり初めていたので必死で書きました。

どう考えても目視はやばい。

構造

以下の2ファイルを同一ディレクトリに用意して使います。

  • このバッチ
  • DB名とテーブル名を持つCSV

以下のように処理してDBのデータを比較します。

  • 新旧サーバーの対象のテーブルに対してBCPでエクスポート
  • エクスポートの結果をfcコマンドで比較。fcのログを出す。
    • 同一なら先頭にok
    • 相違なら先頭にngがつく

バッチのソース

@echo off
setlocal

pushd %~dp0

rem DBとテーブルのリストファイル名
set targetList=

rem ユーザーのアカウント
set OldSvrUser=
set NewSvrUser=
set OldSvrPass=
set NewSvrPass=

rem 比較サーバーインスタンス
set OldServer=
set NewServer=

rem 出力先フォルダ
powershell -Command "$(Get-Date).ToString('yyyyMMdd_HHmmss')" > %temp%\ret
set /p ymd=< %temp%\ret
set BaseFolder=%UserProfile%\Desktop\SvrDataComp\%ymd%\
set OldFolder=%BaseFolder%Old\
set NewFolder=%BaseFolder%New\

mkdir %BaseFolder%
mkdir %OldFolder%
mkdir %NewFolder%

rem 指定のリストからループして出力
for /f "tokens=1,2* delims=," %%i in (%targetList%) do (  
    call :CompareOldNewServer %%i %%j
)

popd
endlocal
exit

rem --------------------------------------------------------------------------------------
rem エクスポート処理
rem --------------------------------------------------------------------------------------
:ExportTable

rem 引数
set instance=%1
set db=%2
set table=%3
set exportPath=%4
set usr=%5
set pass=%6

TITLE Exporting [Server:%instance% DB:%db% Table:%table%]
bcp "SELECT * FROM %db%.dbo.%table%" queryout %exportPath% -S %instance% -U%usr% -P%pass% -w -k -o %exportPath%.log

exit /b

rem --------------------------------------------------------------------------------------
rem 新旧サーバーのテーブルのエクスポートと比較
rem --------------------------------------------------------------------------------------
:CompareOldNewServer

rem 引数
set db=%1
set table=%2

set  fileName=%db%_%table%.txt
set  oldExport=%OldFolder%%fileName%
set  newExport=%NewFolder%%fileName%


call :ExportTable %OldServer% %db% %table% %oldExport% %OldSvrUser% %OldSvrPass%
call :ExportTable %NewServer% %db% %table% %newExport% %NewSvrUser% %NewSvrPass%

set  compFile=%BaseFolder%ng_%db%_%table%.txt
fc  /a /c /n /u %oldExport% %newExport% > %compFile% 

if "%errorlevel%"=="0"  move %compFile% %BaseFolder%ok_%db%_%table%.txt
exit /b