SQL Server × Access

Accessのパススルークエリ徹底解説:高パフォーマンスなSQL Server操作

nanikatoaccess

以下では、**「Accessのパススルークエリ徹底解説:高パフォーマンスなSQL Server操作」**をテーマに、パススルークエリがなぜ効率的なのか、どのように作成・活用するのかを詳しく解説します。AccessとSQL Serverを連携している方や、大規模データのクエリ速度に課題を感じている方は、ぜひ参考にしてみてください。


1. パススルークエリとは?

パススルークエリ (Pass-Through Query) は、Accessのクエリエンジンを介さずに、SQL Server(や他のODBCデータベース)へ直接SQL文を渡して実行する仕組みです。通常のクエリ (.accdb) では、Accessがクエリを解釈しJet/ACEエンジンで実行しますが、パススルークエリではSQL文がそのままSQL Server上で実行されるため、以下のメリットがあります。

メリット

  • 高パフォーマンス: 大量データの集計や複雑なJOINは、SQL Serverのエンジンが直接最適化・実行してくれる
  • 固有SQLをフル活用: SQL Serverの方言 (T-SQL) やストアドプロシージャの呼び出しが可能
  • ネットワーク負荷の軽減: 必要最小限の結果セットだけをAccessへ返してもらうため、大量行のやり取りを抑制できる

2. パススルークエリを作成する手順

ないものはない!お買い物なら楽天市場

2.1 SQLビューでの新規作成

  1. [作成]タブ →[クエリデザイン] を選択(テーブル追加画面はキャンセル)
  2. デザイン画面で[SQLビュー]に切り替える
  3. クエリプロパティ(右クリック→[プロパティ])を開き、**「SQLのパススルー」**に設定
  4. 接続文字列 (ODBC接続情報) を設定
    • たとえば DSNやDSNレス接続文字列を入力し、SQL Serverへの認証情報を指定
  5. SQL文を直接記載sqlコピーするSELECT 顧客ID, 顧客名, 売上高 FROM dbo.顧客売上ビュー WHERE 売上高 > 100000;
  6. クエリを保存し、実行すると結果が表示される

2.2 ODBC接続文字列設定

  • クエリのプロパティから「ODBC接続文字列」の欄でDSNファイルを指定するか、またはDSNレス接続文字列Driver={SQL Server Native Client 11.0};Server=xxx;Database=xxx;Uid=xxx;Pwd=xxx;など)を貼り付ける
  • 接続情報が正しければ**「テスト接続」**が成功し、パススルークエリ実行時にSQL Serverに直接問い合わせを行う

暗号化や認証への注意

  • SQL認証の場合、IDとパスワードが文字列に含まれるため管理に注意
  • Windows認証を使う(Azure AD など)なら、接続文字列にパスワードを含めずに済む
  • Encrypt=yes;TrustServerCertificate=no; などでTLS通信を行い、セキュリティを高める

3. パススルークエリ活用例

3.1 複雑なSQLを書いて高速処理

下記のような複雑なSQL文でも、パススルークエリに記述すればSQL Server上で最適化され、Accessのクエリエンジンを経由しないため高速です。

SELECT C.顧客ID, C.顧客名,
SUM(CASE WHEN O.注文日 BETWEEN '2023-01-01' AND '2023-12-31' THEN O.数量 * O.単価 ELSE 0 END) AS 当年売上,
SUM(CASE WHEN O.注文日 BETWEEN '2022-01-01' AND '2022-12-31' THEN O.数量 * O.単価 ELSE 0 END) AS 前年売上
FROM dbo.顧客マスタ C
LEFT JOIN dbo.受注テーブル O ON C.顧客ID = O.顧客ID
GROUP BY C.顧客ID, C.顧客名
HAVING SUM(CASE WHEN O.注文日 BETWEEN '2023-01-01' AND '2023-12-31' THEN O.数量 * O.単価 ELSE 0 END) > 500000
ORDER BY 当年売上 DESC;

3.2 ストアドプロシージャ実行

パススルークエリはSQL文だけでなく、ストアドプロシージャを呼び出す用途にも役立ちます。以下は簡単な例:

EXEC dbo.月次売上集計 '2023-01-01', '2023-12-31'
  • 通常のAccessクエリではストアドプロシージャを直接呼べないが、パススルークエリならT-SQLを丸ごと渡せる
  • 引数付きのプロシージャもOK。パラメータ化が必要な場合はVBAでSQL文字列生成して差し込むか、フォームから動的に書き換える工夫が必要

4. 動的にパススルークエリを作る(VBA例)

ユーザーがフォームで入力した条件をもとにパススルークエリのSQLを組み立てたい場合、QueryDefオブジェクトを使ってSQL文や接続文字列を動的に書き換えるのが便利です。

Public Sub UpdatePassThroughQuery(strStart As String, strEnd As String)
Dim qdf As DAO.QueryDef
Dim strSQL As String
Dim strConnect As String

' パススルークエリ名
Const cPTQueryName = "qry売上集計パススルー"

' SQLを動的に生成
strSQL = "SELECT 顧客ID, SUM(数量*単価) AS 売上 " & _
"FROM dbo.受注テーブル " & _
"WHERE 注文日 BETWEEN '" & strStart & "' AND '" & strEnd & "' " & _
"GROUP BY 顧客ID;"

' ODBC接続文字列 (DSNレス例)
strConnect = "ODBC;Driver={SQL Server Native Client 11.0};" & _
"Server=xxxx.database.windows.net;" & _
"Database=MyDB;" & _
"Uid=MyUser;" & _
"Pwd=MyPass;" & _
"Encrypt=yes;"

On Error Resume Next
Set qdf = CurrentDb.QueryDefs(cPTQueryName)
If qdf Is Nothing Then
' パススルークエリが存在しなければ新規作成
Set qdf = CurrentDb.CreateQueryDef(cPTQueryName)
End If
On Error GoTo 0

' パススルークエリの設定を更新
qdf.Connect = strConnect
qdf.SQL = strSQL
qdf.ReturnsRecords = True ' SELECT文なのでTrue

' 保存
CurrentDb.QueryDefs.Refresh
MsgBox "クエリ [" & cPTQueryName & "] を更新しました。", vbInformation
End Sub
  • 実行例:Call UpdatePassThroughQuery("2023-01-01", "2023-12-31")
  • 実行後、**「qry売上集計パススルー」**を開けば、設定した期間でSQL Serverへ直接クエリを投げるようになる
  • フォームのテキストボックス入力を引数に渡せば動的なパラメータクエリとして使える

5. パフォーマンス最適化のコツ

  1. サーバー側で完結するSELECT文を作る
    • WHERE句やGROUP BYを可能な限りSQL Serverに任せ、Accessでの処理を最小化
  2. インデックス確認
    • SQL Server上のテーブルに必要なインデックスがあるかチェック
    • 大量データのスキャンを避ける
  3. ストアドプロシージャを活用
    • 複雑処理やトランザクションがある場合、サーバー側のストプロをパススルークエリで呼び出すと高速
  4. 接続文字列の暗号化/セキュリティ
    • Encrypt=yes;TrustServerCertificate=no; を使い、通信経路をTLS化しながら安全に高速処理
  5. 結合先の絞り込み
    • LEFT JOINなどは必要最小限にし、本当に必要なデータだけ返す設計にする

6. 注意点・トラブルシュート

  1. パススルークエリの結果は基本的に読み取り専用
    • SELECT文やストプロ結果はAccess側でレコード編集できない場合が多い
    • UPDATEやINSERT目的の場合は、ストプロやAction Queryをパススルーで実行し、レコードセットは返さない(ReturnsRecords=False)
  2. ローカルフィールドとのJOIN不可
    • パススルークエリはAccessエンジンを経由せず、SQL Server側だけで完結するため、AccessのローカルテーブルとのJOINなどはできない
    • 必要ならAccess側で別のクエリを組むか、リンクテーブルもSQL Serverにアップロードする
  3. ODBC接続文字列の管理
    • ID/PW含む文字列をコピペすると漏洩リスクあり
    • DSNファイルやWindows認証の活用も視野に入れる

7. まとめ:高パフォーマンスを実現する Access × SQL Server 連携の必須テクニック

  1. パススルークエリは、SQL Serverに直接SQL文(SELECT, EXECストアドプロシージャなど)を投げて高速に実行させる方法
  2. 作成方法:
    • クエリデザインビュー → SQLのパススルー → ODBC接続文字列設定 → SQLを丸ごと記載
    • VBAでQueryDefを使い動的に生成したり、ストアドプロシージャを呼び出したりできる
  3. メリット:
    • 大量データや複雑JOINもSQL Serverエンジンに任せるため高速
    • Access側の制約が少ない形でT-SQL文を書ける(方言利用OK)
  4. 運用ポイント:
    • パススルークエリは読み取り専用が多い(UPDATE/INSERTはストアドプロシージャまたはAction Queryとしてパススルー)
    • 接続文字列やセキュリティ設定を適切に管理
    • パラメータを含む動的クエリはVBAから組み立て

AccessでSQL Serverを扱う上で、パススルークエリは最強の武器です。フォームのレコードソースや集計レポートで大規模DBを扱うなら、パススルークエリを活用してパフォーマンスボトルネックを解消してみてください。


関連記事

パススルークエリを正しく理解し、SQL Serverサイドでの最適化と組み合わせることで、Accessフロントエンドでも大規模データをストレスなく操作できる環境を実現できます。ぜひ試行錯誤しながら自分のシステムにマッチした高パフォーマンス連携を作り上げてください。

DMM
ABOUT ME
まー
まー
駆け出しブロガー
入社した会社では、Accessを活用した基幹システムが長年運用されていました。しかし、開発者の高齢化により保守が困難となり、システムの維持・更新が急務に。 ほぼAccessに触れたことのなかった私は、ゼロから学びながら基幹システムを再構築してみることに。ついにはAccessによるシステム開発エンジニアとしてのスキルを身につけるまでに成長。 元々の業務のノウハウとそれを効率化するためのツール(Access)によって業務効率化システムをいくつも開発してきました。 みなさんの”なにか(業務のノウハウ)”とAccessで業務効率化を実現するお役に立てれば幸いです。 月30万の高配当投資も行っています。最新の銘柄情報もお届けしていきます。
googleアドセンス
記事URLをコピーしました