【入門編】SQL ServerのリンクテーブルをQueryDefで操作する際の「パススルー」変換テクニック – Access VBA解析バイブル

スポンサーリンク

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という最強のエンジンを操る「スマートなインターフェース」へと変貌します。

ここをクリアすれば、皆さんはもう初心者ではありません。自信を持って、より高度な自動化の世界へ足を踏み入れてください!

—

次回のテーマ予告:
次は、パススルーで取得した大量データを、レコードセットを使わずに一瞬でフォームに表示する「非連結フォームの超高速表示テクニック」を解説します。お楽しみに。

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