AccessからSQL Serverへ:データ移行の「地雷」をVBAで先回り検知する極意
こんにちは。システム開発の現場で、AccessからSQL Serverへのアップサイジングに頭を悩ませるエンジニアを数多く見てきました。
「なんとなく移行したらエラーが止まらない」「特定のフィールドだけインポートに失敗する」……。これらはすべて、データ型の不一致という「見えない地雷」を踏んでいる証拠です。
今回は、Accessの`TableDef`オブジェクトを操作し、SQL Server移行時の型変換リスクを自動で洗い出す「移行支援ツール」の作り方を伝授します。ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。Accessの深淵に触れる第一歩を、一緒に踏み出しましょう。
—
なぜ「移行ツール」を自作する必要があるのか?
Accessは柔軟です。しかし、SQL Serverは厳格です。
- Accessの「短いテキスト」は、SQL Serverの`nvarchar(255)`に相当しますが、もしそのフィールドに256文字以上入っていたら?
- Accessの「数値型(倍精度)」は、SQL Serverの`float`ですが、厳密な計算には`decimal`が必要です。
こうした差異を手作業でチェックするのは非効率です。VBAを使って、「今のテーブルがSQL Serverの型定義に適合しているか」をコードで判定する仕組みを作ります。
—
1. 準備:DAOオブジェクトの基本を理解する
Access VBAでテーブル構造を操作するには、DAO (Data Access Objects) というライブラリを使います。まずは、テーブル定義(`TableDef`)とフィールド(`Field`)の階層構造をイメージしてください。
- `Database` > `TableDef`(テーブル) > `Field`(列)
これらを巡回し、型を検査するコードが以下です。
—
2. 【実装コード】型変換チェックツール
このコードは、指定したテーブルの各フィールドを走査し、SQL Serverでエラーになりそうな項目をイミディエイトウィンドウに出力します。
‘ 必要な参照設定: Microsoft Office 16.0 Access database engine Object Library
Sub CheckMigrationCompatibility()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Set db = CurrentDb
‘ チェック対象のテーブル名
Dim targetTable As String
targetTable = “T_社員マスタ”
Set tdf = db.TableDefs(targetTable)
Debug.Print “— ” & targetTable & ” の移行チェック開始 —”
For Each fld In tdf.Fields
‘ フィールド名とデータ型のチェック
Select Case fld.Type
Case dbText ‘ 10: テキスト型
‘ SQL Serverのnvarchar(255)に対してサイズが適切かチェック
If fld.Size > 255 Then
Debug.Print “警告: [ ” & fld.Name & ” ] はサイズが ” & fld.Size & ” です。SQL Server移行時に切捨て注意。”
End If
Case dbDouble ‘ 7: 倍精度浮動小数点数
Debug.Print “注意: [ ” & fld.Name & ” ] は浮動小数点数です。SQL Serverでは精度不足になる可能性があります。”
Case dbLong ‘ 4: 長整数型
‘ 問題なし
End Select
Next fld
Debug.Print “— チェック終了 —”
End Sub
—
3. コードのポイントを解説
- `For Each … In …` の活用:
テーブルの列数が増減しても、このループ構造ならコードを修正する必要はありません。これが「メンテナンス性の高いコード」の第一歩です。
- `fld.Type` と `fld.Size`:
Accessの内部定数を使います。`dbText`や`dbLong`といった型定数を知っておくと、どんな複雑なテーブル構造でも自在に扱えるようになります。
- イミディエイトウィンドウ:
`Debug.Print` は開発者の味方です。ログを確認しながら、移行計画を練り上げてください。
—
4. 陥りやすいエラーと対策
① 参照設定の欠如
コード実行時に「ユーザー定義型は定義されていません」と出る場合、VBAエディタのメニュー「ツール」→「参照設定」で `Microsoft Office 16.0 Access database engine Object Library` にチェックが入っているか確認してください。これがDAOの心臓部です。
② システムテーブルの誤操作
`TableDef`には、Access内部で使うシステムテーブル(`MSys~`で始まるもの)も含まれています。`If Left(tdf.Name, 4) <> “MSys” Then` のように除外条件を入れるのが、プロのエンジニアの作法です。
—
最後に:ここをクリアすれば、あなたは「自動化の旗手」
このツールは、単なる「チェックツール」ではありません。「Accessというブラックボックスの中身を、コードで可視化する」というエンジニアリングの第一歩です。
型変換のルールを理解し、それをVBAに落とし込む作業を繰り返せば、どんな大規模なマイグレーションも怖くありません。一つひとつ、コードを書いて自分の道具を増やしていきましょう。
もし詰まったら、いつでも戻ってきてください。私たちは常に、より良いコードを追求する仲間なのですから。
それでは、素晴らしい自動化ライフを!
