私はあなたがここで何を意味しているのか分かりません: "クエリ アクセスの場合、 where 句を実行する前にすべてのレコードをロードします"
サーバーで句を適用できる場合WHERE
、ODBC はそれをサーバーの言語に翻訳し、一致する行のみが Access に送り返されます。
WHERE date_field >= #2011-01-01# AND date_field < #2012-01-01#
このWHERE
句は、Access に送信される行を、date_field
値が 2011 年のものだけに制限します。
ただし、WHERE
句に Access で評価する必要がある関数が含まれている場合、ODBC はすべての候補行を取得し、それらを Access db エンジンに渡して、評価を実行できるようにする必要があります。
WHERE Format(date_field, 'yyyy') = '2011'
しかし、実際の質問については...パススルークエリの接続文字列...次のコード例を検討してください。dbo_foo
SQL Server のソース テーブルがという名前の ODBC リンクがあります[dbo].[foo]
。したがって、.Connect
プロパティを取得して、同じサーバー テーブルに基づくパススルー クエリdbo_foo
のプロパティとして使用できます。.Connect
Public Sub CreatePassThruQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strConnect As String
Set db = CurrentDb
strConnect = db.TableDefs("dbo_foo").Connect
Set qdf = db.CreateQueryDef("qryDbo_Foo")
qdf.Connect = strConnect
qdf.SQL = "SELECT * FROM [dbo].[foo];"
qdf.Close
Set qdf = Nothing
Set db = Nothing
End Sub
それでも.Connect
、テーブルのプロパティを変更する場合は、クエリに対しても変更する必要があります。それらが多数ある場合や接続を頻繁に変更する場合は、それらを更新するための VBA プロシージャを作成する価値があるかもしれません。.Connect
または、テーブルのプロパティと一致するクエリにDSN を使用することもできます。その後、必要に応じて DSN を修正します。このアプローチの落とし穴は、他の人がアプリケーションを使用する場合、複数のマシンで DSN を管理する必要があることです。