Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

【A5:SQL Mk-2】A5M2cmdで複数テーブルを順番にSELECTして「テーブル名.csv」で出力するバッチ

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

A5:SQL Mk-2のコマンドライン版 A5M2cmd.exe を使うと、SQLをバッチ実行して結果をCSVに保存できます。

今回は、

TABLE_A
TABLE_B
TABLE_C

というテーブル一覧を用意しておき、

SELECT *
FROM テーブル名
WHERE ...

の「テーブル名」部分だけを順番に差し替え、

TABLE_A.csv
TABLE_B.csv
TABLE_C.csv

として自動出力する方法を紹介します。

スポンサーリンク
バッチ処理の自動化スキルは市場価値が高いです。今の自分の単価を調べてみませんか?
顧客常駐はもう嫌だ!社内SEへ転職するなら【社内SE転職ナビ】
Cursor・Claude Code・Codex AIスキルを学ぶなら
環境構築不要!AIエージェント開発を非エンジニアでも即実践【AI Agent Camp】

処理のイメージ

用意するのは次の3ファイルです。

C:\A5Export\
├─ tables.txt
├─ select_template.sql
└─ export_tables.bat

出力先は、

C:\A5Export\CSV\

とします。

処理は、

tables.txt
   ↓
TABLE_Aを取得
   ↓
SQLテンプレートの{TABLE}をTABLE_Aへ置換
   ↓
A5M2cmdで実行
   ↓
TABLE_A.csv

   ↓

TABLE_B
TABLE_C...

という流れです。


1. テーブル一覧を作る

tables.txt を作成します。

TABLE_A
TABLE_B
TABLE_C

スキーマ名を付ける場合は、

SCHEMA1.TABLE_A
SCHEMA1.TABLE_B
SCHEMA2.TABLE_C

のように記述しても構いません。

1行につき1テーブルにしておくのがポイントです。


2. SELECT文のテンプレートを作る

select_template.sql を作成します。

例えば単純に全件取得するなら、

SELECT *
FROM {TABLE};

とします。

条件を付けても構いません。

SELECT *
FROM {TABLE}
WHERE UPDATE_DATE >= CURRENT_DATE - 7;

必要な列だけ取得することもできます。

SELECT
    ID,
    NAME,
    UPDATE_DATE
FROM {TABLE};

{TABLE} の部分を、バッチで実際のテーブル名に置き換えます。


3. バッチファイルを作る

export_tables.bat を作成します。

ここではPowerShellを使ってSQLテンプレートの文字列置換を行います。

@echo off
setlocal EnableDelayedExpansion

rem ==================================================
rem 設定
rem ==================================================

set "A5CMD=C:\A5M2cmd\A5M2cmd.exe"

set "BASE=C:\A5Export"
set "TABLELIST=%BASE%\tables.txt"
set "TEMPLATE=%BASE%\select_template.sql"
set "WORKSQL=%BASE%\work.sql"
set "OUTDIR=%BASE%\CSV"

rem DB接続文字列
set "CONNECT=__ConnectionType=Internal;ProviderName=PostgreSQL;UserName=USER;Password=PASSWORD;ServerName=localhost;Port=5432;Database=TESTDB;ProtocolVersion=30"

rem ==================================================
rem 出力フォルダ作成
rem ==================================================

if not exist "%OUTDIR%" mkdir "%OUTDIR%"

rem ==================================================
rem テーブルごとに処理
rem ==================================================

for /f "usebackq delims=" %%T in ("%TABLELIST%") do (

    echo ==========================================
    echo Export : %%T
    echo ==========================================

    powershell -NoProfile -Command ^
      "(Get-Content -Raw '%TEMPLATE%').Replace('{TABLE}','%%T') | Set-Content -Encoding UTF8 '%WORKSQL%'"

    "%A5CMD%" ^
      "/Connect=%CONNECT%" ^
      /RunSQL ^
      /Encoding=UTF-8 ^
      "/FileName=%WORKSQL%" ^
      "/FilePattern=%OUTDIR%\%%T.csv"

    if errorlevel 1 (
        echo [ERROR] %%T
    ) else (
        echo [OK] %%T
    )
)

del "%WORKSQL%" 2>nul

echo.
echo Export completed.
endlocal

接続文字列は利用するDBに合わせて変更してください。

A5M2cmdは /Connect/RunSQL/FileName を使ってSQLファイルを実行でき、SELECT結果はCSVとして出力されます。


4. 実行するとどうなるか

tables.txt が、

TABLE_A
TABLE_B
TABLE_C

なら、内部ではまず、

SELECT *
FROM TABLE_A;

が生成されます。

A5M2cmdで実行したあと、次は、

SELECT *
FROM TABLE_B;

そして、

SELECT *
FROM TABLE_C;

と順番に処理します。

結果は、

C:\A5Export\CSV\
├─ TABLE_A.csv
├─ TABLE_B.csv
└─ TABLE_C.csv

となります。

/FilePattern には相対パス・絶対パスを含めて指定できるため、CSVの保存先を任意のフォルダにできます。


なぜSQLファイルを毎回作るのか

「A5M2cmdにテーブル名を直接パラメータとして渡せないのか?」

と思うかもしれません。

A5M2cmdについては、SQLファイルへ動的パラメータを渡す専用オプションがないと開発者から案内されています。

そのため、

A5M2cmd
↓
TABLE_Aという変数をSQLへ直接渡す

より、

バッチ
↓
SQLテンプレートを書き換える
↓
一時SQLを作る
↓
A5M2cmdで実行

という方法がシンプルです。


任意のSELECT文を使える

この方法のメリットは、単なる、

SELECT *
FROM {TABLE};

だけではないことです。

例えば件数だけ取得するなら、

SELECT COUNT(*)
FROM {TABLE};

特定条件だけなら、

SELECT *
FROM {TABLE}
WHERE STATUS = '1';

共通カラムがあるテーブルなら、

SELECT
    ID,
    NAME,
    CREATED_AT,
    UPDATED_AT
FROM {TABLE}
WHERE CREATED_AT >= '2026-01-01';

のようにできます。

つまり、

テーブル名だけ可変にして、SELECT条件は共通化する

用途に向いています。


PostgreSQLでの例

PostgreSQLなら、接続文字列は例えば次のようになります。

set "CONNECT=__ConnectionType=Internal;ProviderName=PostgreSQL;UserName=USER;Password=PASSWORD;ServerName=localhost;Port=5432;Database=TESTDB;ProtocolVersion=30"

実際のユーザー名・パスワード・サーバ名・DB名へ置き換えます。


MySQLでの例

MySQLなら例えば、

set "CONNECT=__ConnectionType=Internal;ProviderName=MySQL;UserName=USER;Password=PASSWORD;ServerName=localhost;Port=3306;Database=TESTDB"

という形です。

A5M2cmdでは、接続文字列を /Connect= に指定してSQLを実行します。


スキーマ名付きテーブルの場合

例えば、

public.customer
public.orders
master.product

という一覧なら、そのままSQLへ入れることもできます。

SELECT *
FROM public.customer;

CSVも、

public.customer.csv
public.orders.csv
master.product.csv

となります。

Windowsではピリオドはファイル名に使用できます。

もしCSV名からスキーマ名を除いて、

customer.csv
orders.csv
product.csv

としたい場合は、バッチ側でファイル名用の文字列を別途加工します。


SQL識別子に特殊文字がある場合は注意

今回のサンプルは、

TABLE_A
SCHEMA.TABLE_A

のような通常のテーブル名を想定しています。

テーブル名に、

空白
ハイフン
大文字小文字を厳密に区別する識別子

などが含まれる場合は、DBに応じた引用符が必要です。

PostgreSQLなら例えば、

SELECT *
FROM "My Table";

SQL Serverなら、

SELECT *
FROM [My Table];

となります。

この場合は tables.txt やSQLテンプレートの作り方を調整してください。


CSVをA5へ戻す場合

この方法で出力されるのは通常のCSVです。

そのため、A5:SQL Mk-2のCSVインポート機能で再利用できます。

例えば、

TABLE_A.csv

をA5:SQL Mk-2から読み込み、別テーブルへ投入するといった使い方ができます。

ただしCSVに保存されるのはSELECT結果だけです。

主キー
インデックス
外部キー
デフォルト値
トリガー
テーブル定義

などは保存されないので、DB全体の完全バックアップとして使うものではありません。


バックアップ用途ならSELECT *が分かりやすい

データ退避を目的にするなら、

SELECT *
FROM {TABLE};

としておけば、

TABLE_A.csv
TABLE_B.csv
TABLE_C.csv

という形でテーブル単位にデータを保存できます。

例えばWindowsタスクスケジューラと組み合わせれば、

毎日深夜
↓
export_tables.bat
↓
対象テーブルを順番にSELECT
↓
CSV保存

という自動処理にもできます。


注意:接続パスワード

サンプルでは分かりやすくするため、

Password=PASSWORD

としています。

実運用でバッチファイルへパスワードを直接書く場合は、その .bat ファイルを他ユーザーから読めないようアクセス権を設定するなどの対策が必要です。


まとめ

A5M2cmdで複数テーブルを順番にCSV出力する場合は、

tables.txt
↓
テーブル名を1件取得
↓
select_template.sql の {TABLE} を置換
↓
work.sqlを生成
↓
A5M2cmdで実行
↓
テーブル名.csv

という構成にすると分かりやすくなります。

例えば、

TABLE_A
TABLE_B
TABLE_C

というリストから、

TABLE_A.csv
TABLE_B.csv
TABLE_C.csv

を自動生成できます。

SQLテンプレートを書き換える方式なので、

SELECT *
FROM {TABLE};

だけでなく、

SELECT *
FROM {TABLE}
WHERE 条件;

など任意のSELECT文を共通適用できるのもメリットです。

大量のテーブルから同じ条件でデータを取得したい場合や、定期的に複数テーブルをCSV退避したい場合に便利な方法です。

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