MS Access如何连接链接表(链接到同一SQL服务器数据库)?

时间:2008-12-08 00:03:14

标签: ms-access join

每当每个表链接到同一SQL Server数据库中的表时,我都有带有链接表的MS Access数据库。我在Access中有一个连接两个表的查询(特别是我正在使用连接更新基于另一个表的表)。

问题是在进行连接之前Access是否“下载”了所有表格数据?或者是聪明的并加入SQL Server?

查询是:

UPDATE TBL_INVOICE_CHARGES INNER JOIN TBL_ANI 
ON  (TBL_INVOICE_CHARGES.CH_CUST_ID = TBL_ANI.ANI_CUST_ID) 
AND (TBL_INVOICE_CHARGES.CH_ANI = TBL_ANI.ANI_NZ_ANI) 
SET TBL_INVOICE_CHARGES.ANI_NOTES = TBL_ANI.ANI_NOTES;

3 个答案:

答案 0 :(得分:2)

根据Albert D. Kallal(Access MVP)的说法,除了复杂的视图之外,Access不会拉动整个表格。但是,最好在服务器上使用视图并链接到视图,或使用pass-though查询。

更多信息:How to create an SQL pass-through query in Access

答案 1 :(得分:2)

可能Jet会将整个事情交给SQL Server,后者将执行索引连接,然后执行更新。换句话说,对于像您的示例这样的简单查询,它是所有在服务器上完成,没有一个字节被拉过线进行本地处理。

让Jet拉开整个桌子非常容易。最简单的方法是在WHERE子句中放入Access表达式。这是一个会导致它发生的例子:

   WHERE Format(MyDate,"YYYY") = 2008

必须拉出整个表,以便Access可以在表中的所有日期运行Format()函数。此外,它将无法使用任何索引,因此将非常慢。 Jet后端也会很慢,仅仅是因为效率太低。编写此WHERE子句的正确方法是:

   WHERE MyDate Between #1/1/2008# And #12/31/2008#

如果您在保存的Access查询中写入它,它将被传递到SQL Server进行处理(如果您的后端数据库引擎使用的不同于Jet SQL使用的,则ODBC将发送适当的分隔符。)

但是,如果你没有做那种事情,你就不太可能遇到通过网络吸收过多数据的问题。事实上,Jet非常聪明,并且能够尽可能地通过线路发送尽可能多的查询。例如,如果在SELECT语句中调用Access函数,则不会将具有Access函数的基础选择发送到服务器,然后将在结果集的Access中执行这些函数。对于此Access查询:

   SELECT Format(MyDate,"MM-DD")
   FROM MyTable
   WHERE MyDate Between #1/1/2008# And #12/31/2008#

Jet会将此信息发送到服务器:

   SELECT MyDate
   FROM MyTable
   WHERE MyDate Between #1/1/2008# And #12/31/2008#

一旦Jet从服务器仅收到符合条件的行,它将只使用Access Format()函数格式化日期字段。这也适用于JOIN,特别是索引字段上的连接(尽管非索引字段连接也可能会传递给服务器)。

现在,有时Jet确实猜错了,最终效率极低。在这些情况下,您可以在服务器上设置视图和存储过程,并使用直通查询来确保Jet的错误猜测将被避免。

答案 2 :(得分:0)

我看过SQL Profiler(遗憾的是我没有实际的日志),这就是我发现的:

  • 选择两个表中的所有记录
  • 对于一个表中的每个记录调用UPDATE 所以这会很慢。