ちゃんとしたシステムを作るときはER図を作ったりデータベースレイアウトを残しておくのですが、ちょっとしたツールを作る時にはなかなかそこまで手をかけて作りません。もちろん外部キーとかも設定していないので結局一つ一つのテーブルを見直したりしますが、結構面倒だし、場合によってはもれてしまう可能性もあります。
そんな時には、列名をキーにしてその列名を含むテーブル名称の一覧を取得するこのバッチファイルが役に立ちます。
@ECHO OFF SET WRKSQL="%TEMP%\wrk.sql" SET SQLTOOL=OSQL SET SVNAME=%COMPUTERNAME% SET DBNAME=master SET COLUMNNAME=UserName SET LOGFILE="%TEMP%\conf.log" SET CONF=Y SET CONNUSER=sa SET CONNPASS=XXXXXXXX :INPUTSV CLS ECHO 接続先サーバ名を入力してください SET /PSVNAME=[初期値=%SVNAME%]: ECHO. %SQLTOOL% -U%CONNUSER% -P%CONNPASS% -S%SVNAME% -dmaster -Q"SET NOCOUNT ON" | FIND "DBNETLIB" > NUL IF "%ERRORLEVEL%"=="0" ( ECHO サーバに接続出来ません[%SVNAME%] ECHO. PAUSE > NUL GOTO INPUTSV ) :INPUTDB IF "%DBNAME%"=="?" ( SET DBNAME=master ) ECHO 接続先データベース名を入力してください ECHO [?と入れるとデータベース名の一覧を表示します] SET /PDBNAME=[初期値=%DBNAME%]: ECHO. IF "%DBNAME%"=="?" ( %SQLTOOL% -U%CONNUSER% -P%CONNPASS% -S%SVNAME% -dmaster -n -Q"SELECT Convert(varchar(20),name) as データベース名 FROM sysdatabases order by 1" ECHO. GOTO INPUTDB ) ECHO 検索列名を入力してください SET /PCOLUMNNAME=[初期値=%COLUMNNAME%]: ECHO. CLS ECHO ------------------------------------------------------ ECHO ★入力された情報は以下のとおりです ECHO 間違いが無いかどうか確認してください ECHO. ECHO [1] 接続先サーバ名 = %SVNAME% ECHO [2] 接続先データベース名 = %DBNAME% ECHO [3] 検索対象列名 = %COLUMNNAME% ECHO ------------------------------------------------------ ECHO. ECHO 再度入力する場合はN or nを入力してください SET /PCONF=[N or n:再入力 ←以外は続行] IF "%CONF%"=="N" GOTO INPUTSV IF "%CONF%"=="n" GOTO INPUTSV :// クエリファイル削除 IF EXIST %WRKSQL% ( DEL %WRKSQL% /F /Q ) :// ログファイル初期化 ECHO ★列名一覧取得 [実行者:%USERNAME% %DATE% %TIME%] > %LOGFILE% ECHO. >> %LOGFILE% ECHO [1] 接続先サーバ名 = %SVNAME% >> %LOGFILE% ECHO [2] 接続先データベース名 = %DBNAME% >> %LOGFILE% ECHO [3] 検索対象列名 = %COLUMNNAME% >> %LOGFILE% ECHO. >> %LOGFILE% :// クエリファイル作成 ECHO SELECT Convert(varchar(20),so.name) as TableName > %WRKSQL% ECHO FROM syscolumns as sc inner join sysobjects as so >> %WRKSQL% ECHO on (sc.id = so.id) >> %WRKSQL% ECHO where (so.type = 'U') and (sc.name = '%COLUMNNAME%') ORDER BY 1 >> %WRKSQL% ECHO. >> %LOGFILE% ECHO [実行クエリファイル] >> %LOGFILE% TYPE %WRKSQL% >> %LOGFILE% ECHO. >> %LOGFILE% :// クエリを実行 %SQLTOOL% -U%CONNUSER% -P%CONNPASS% -d%DBNAME% -S%SVNAME% -n -w2000 -i%WRKSQL% >> %LOGFILE% :// ログファイル確認 NOTEPAD %LOGFILE% :// クエリファイル削除 IF EXIST %WRKSQL% ( DEL %WRKSQL% /F /Q )
変数が多過ぎて分かりにくいのですが、そこはご容赦を。基本的にはsysobjects , syscolumns からデータを取得します。