Accessの限界を超える:「パススルー」でSQL Serverを完全掌握する極意
こんにちは。現場で「Accessが重い」という悲鳴を聞くたびに、私は「それはAccessが悪いのではなく、データの『運び方』が悪いのです」と伝えています。
皆さんが普段使っているAccessのクエリは、実は「一度Accessエンジンという通訳を介して、SQL Serverに命令を翻訳して伝えている」状態です。データ量が数万件を超えると、この「通訳」がボトルネックになり、PCが固まったような状態になります。
今回は、その通訳をすっ飛ばし、SQL Serverに直接命令を投げ込む「パススルー」という魔法のテクニックを伝授します。
—
1. なぜ「パススルー」が必要なのか?
通常、Accessのクエリは「Jet/ACEエンジン」がSQLを解釈します。しかし、リンクテーブル越しに複雑な計算や大量データのフィルタリングを行うと、AccessはSQL Serverから全データを一度自分のメモリに取り込もうとします。
パススルーを実行すると:
1. SQL文がそのままSQL Serverへ送られる。
2. SQL Server側で計算が完結する。
3. 結果だけがAccessに戻ってくる。
この仕組みを使うと、処理速度が10倍〜100倍になることも珍しくありません。
—
2. 実践:パススルー・クエリの作成とVBA操作
パススルー・クエリは、通常のクエリとは異なり「SQL Serverに直接投げる」という設定が必要です。これをVBAで動的に構築するのが、プロフェッショナルへの第一歩です。
ステップ1:接続情報の取得
まず、リンクテーブルがどのデータベースを見ているかを知る必要があります。以下のコードで、現在使用している接続文字列を取得しましょう。
‘ 現在のリンクテーブルの接続情報を取得する関数
Public Function GetConnectString() As String
‘ リンクテーブル名を指定(適宜変更してください)
GetConnectString = CurrentDb.TableDefs(“dbo_YourTable”).Connect
End Function
ステップ2:パススルー・クエリの生成
次に、VBAでクエリを作成し、それを「パススルー」に変換します。
Public Sub CreatePassThroughQuery(sqlText As String)
Dim qdf As DAO.QueryDef
‘ 同名のクエリがあれば削除(クリーンな状態にする)
On Error Resume Next
DoCmd.DeleteObject acQuery, “qry_PassThrough_Temp”
On Error GoTo 0
‘ 新しいクエリを作成
Set qdf = CurrentDb.CreateQueryDef(“qry_PassThrough_Temp”)
‘ 【重要】ここがパススルー化の心臓部
‘ 接続先をSQL Serverに向ける
qdf.Connect = GetConnectString
‘ クエリ自体に「これはパススルーである」と教える
qdf.SQL = sqlText
‘ 返り値が不要な場合は「戻り値なし」にする(パフォーマンス向上)
qdf.ReturnsRecords = True
‘ クエリを閉じる
qdf.Close
Debug.Print “パススルー・クエリが準備完了しました。”
End Sub
—
3. 現場で陥りやすい「落とし穴」
この技術をマスターする上で、避けて通れない注意点が3つあります。
① SQLの「方言」に注意
パススルーで送るSQLは、SQL Serverの言語(T-SQL)です。Access独自の関数(`Nz()` や `DatePart()` など)は動きません。SQL Server側で用意されている `ISNULL()` や `DATEPART()` を使う必要があります。
② パラメータの動的生成
「動的SQL」を作る際は、文字列結合でSQLを作るのが一般的ですが、「SQLインジェクション」には細心の注意を払ってください。ユーザー入力をそのまま結合せず、必ず文字のクレンジングを行うか、可能な限り定数で処理を組むのがプロの矜持です。
③ `.ReturnsRecords = False` の活用
更新系(UPDATE/DELETE)のSQLを投げる場合は、必ず `qdf.ReturnsRecords = False` に設定してください。これだけで、SQL Serverからのレスポンス待ち時間が劇的に短縮されます。
—
4. 先輩からのアドバイス
「Accessは遅い」と嘆く前に、まずはこのパススルー・クエリを試してみてください。
初めて実装するときは、まずSQL Server Management Studio (SSMS) でSQLを書き、それが正しく動くことを確認してから、そのSQLをVBAの `sqlText` 変数にコピペしてくるのが最も確実な手順です。
この技術を習得すれば、Accessは単なる「小さなデータベースソフト」から、SQL Serverという最強のエンジンを操る「スマートなインターフェース」へと変貌します。
ここをクリアすれば、皆さんはもう初心者ではありません。自信を持って、より高度な自動化の世界へ足を踏み入れてください!
—
次回のテーマ予告:
次は、パススルーで取得した大量データを、レコードセットを使わずに一瞬でフォームに表示する「非連結フォームの超高速表示テクニック」を解説します。お楽しみに。
