SQL 查询和 MS Access 查询返回不同的数据

Posted

技术标签:

【中文标题】SQL 查询和 MS Access 查询返回不同的数据【英文标题】:SQL query and MS Access query returns different data 【发布时间】:2010-04-21 15:33:43 【问题描述】:

我使用 MS Access 作为我的 MS SQL 服务器的前端。

当我在 ms Access 中使用(在我看来)相当于我从 SQL 服务器运行的查询的 SQL 查询时,Access 返回不同的数据。下面的图片说明了差异。我使用 Access 2003,并通过 ODBC 将 Access 表连接到 SQL server (2008)。

有人知道如何解决这个问题吗??

提前致谢

/Iljitj

SQL 和 Access 查询和结果:

(不同的是“Projekt”列)

http://i.imagehost.org/0218/SQL_access_query_and_result.jpg

【问题讨论】:

您必须指向两个不同的表。 Access/SQL Server 不会产生您观察到的差异。 嗯,它是服务器上唯一包含这些列和信息的表,所以这不是问题。 而且表肯定是链接表,不是导入的?因为我看不出在这种情况下 Access 会给出不同结果的任何原因。 表肯定是链接的。当我从 Access og SSMS 更改数据时,它会在我同时在 Access 和 SSMS 中更新时显示。 【参考方案1】:

好的,我解决了这个问题。如果没有唯一标识符,显然 Access 不会做任何事情。由于我的表中没有它,Access 使用 CVRnr 作为标识符,但由于它不是唯一的,Access 只提取第一行并复制它,因此是“不正确”的数据。

我添加了唯一标识符,并将其正确链接到 Access,现在它可以工作了。

非常感谢大家的帮助和建议,如果你们中的一些人没有提出建议,我想我永远不会弄清楚原因是标识符。

你救了我;)

【讨论】:

【参考方案2】:

重新创建 Access 链接表。有时 Access 内部定义会出错,尤其是在链接服务器数据结构发生某些更改、重新创建/更改表/列或类似情况时。

顺便说一句,Access 本身当然不错,它只是用于简单的桌面“数据库”。它有很多限制和一些怪癖,但它非常有用。

【讨论】:

“内部定义”不会“变坏”,只是如果目标表/视图发生更改,存储在表链接中的元数据可能会过时。当服务器上的任何一个表/视图发生更改时,删除并重新创建所有指向表/视图的链接是沼泽标准。 "[Access" 用于简单的桌面“数据库”"。Access 确实支持这一点,但它完全可以扩展以覆盖所有类型的数据库应用程序的很大一部分。有问题中根本没有任何迹象表明发帖人的情况固有的某些因素使 Access 不适合作为前端。 看,我不会说英语;我不能即时生成诸如“如果目标表/视图被更改,存储在表链接中的元数据可能会过时”之类的语句。 “变坏”当然是同一个意思,只是用更短的方式表达(显然但不幸的是错误的);) “变坏”与“不再准确”不同。如果您更改了服务器端对象,您可能需要更改与该对象的客户端交互。不会说使用您从目标表中删除的字段的代码已经坏了——您会说代码需要更新以反映字段定义。同样,需要删除并重新创建链接表以反映对其链接到的服务器端对象的更改。【参考方案3】:

我会停止使用 Access。它似乎非常破碎。首先,让我们找出 select 语句访问真正使用的是什么。

在 SSMS (SQL Server Management Studio) 中转到工具 -> SQL Server Profiler。

附加到同一个数据库,然后查看 Access 正在做什么。文件 -> 新建 -> 连接 -> 运行。

【讨论】:

首先:我做了跟踪,但我不知道该怎么做。该链接是 Access 所做的事情:j.imagehost.org/0808/trace.jpg 其次:我同意 Access 我很垃圾,但我不是一个程序员,我知道一些 VBA 和一点 C#。是否有其他应用程序或类似 Access 的东西可以用作我的 SQL 服务器的前端而不是 Access? CVRNr是表的主键吗?您可以发布表架构吗? 看跟踪就像你说它是同一个表和数据库。但是访问只要求一行。那些主键呢? -1 用于放弃访问。只有无知的人才会建议作为对这个问题的回应。 跟踪正在做一些我不理解的奇怪事情,并向我暗示该表可能没有 PK 或正确的索引。要使 Access 能够使用 ODBC 数据源中的表,它们必须具有主键。此外,我发现确保每个表都有一个时间戳字段很有帮助。这有助于 Access 绑定表单适当地刷新数据。当您将条件更改为 WHERE CVRNr='10598184' 时会发生什么?考虑到 Kunde 和 CVRNr 似乎是依赖数据(跟踪也暗示了这一点),那里看起来确实存在冗余数据。【参考方案4】:

好的,我看到了一些东西......

    您是否为 MS SQL 上的表设置了主键?这可能会让 MS Access 感到困惑。 布尔列确实有不同的值,但我认为这是因为 MS Access 喜欢以不同于 MS SQL 的方式来表示它们。你将不得不忍受的。

【讨论】:

Projekt 列的结果不匹配,我认为这是实际的问题,而不是标准的布尔转换。

以上是关于SQL 查询和 MS Access 查询返回不同的数据的主要内容,如果未能解决你的问题,请参考以下文章

查询在 iif ms-access sql 中不返回真值

VBA 代码中的 MS Access SQL 查询

Ms Access SQL:如何防止 Select 查询重复

MS-Access SELECT TOP N 子查询 SQL

如何使用查询或 VBA 和 SQL 更新 MS ACCESS 中的表

带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075