使用 ODBC 连接到 MYSQL 在 MS-Access 中运行 SQL 时出错
Posted
技术标签:
【中文标题】使用 ODBC 连接到 MYSQL 在 MS-Access 中运行 SQL 时出错【英文标题】:Error running SQL in MS-Access with ODBC connection to MYSQL 【发布时间】:2013-01-02 17:02:57 【问题描述】:我正在帮助一家非营利组织将 MS-Access 数据迁移到 mysql。因此,我将数据移植到 MYSQL,并使用 ODBC 在 ms-access 中创建了对 MYSQL 表的链接。大多数现有的 SQL 都可以正常工作。但是我被这个错误难住了 -
您的 SQL 语法有错误,请检查与您的 MySQL 服务器版本相对应的手册,以获得在 UNION 附近使用的正确语法...
我已经将带有 7 个 UNIONS 的 SQL 剥离到仍然失败的基础上。
(SELECT 1 as A FROM Households H)
UNION ALL
(SELECT 2 as A FROM Households H)
UNION ALL
(SELECT 3 as A FROM Households H)
让我明白的部分是,只要我在 SQL 下面只运行一个 UNION 含义,我就能够成功运行,但是当我添加第三个 UNION 时,它会给出 ODBC 错误
(SELECT 1 as A FROM Households H)
UNION ALL
(SELECT 2 as A FROM Households H)
我尝试使用 ` 或 ' 或 [] 但这些都没有帮助。我对这个错误感到沮丧的原因是它要么全部失败,要么全部失败,只有在使用两个或多个 UNION 子句时才会出错。这可能是驱动程序中的潜在错误吗?
我在带有 ms-access 和 32 位驱动程序的 win-7 64 位上使用 mysql-64 位。这不应该是架构问题,因为我能够使用多个 UNION 运行其他查询,并访问同一组表。
如果有人能指点如何进一步调试,那就太好了。
【问题讨论】:
(原始)查询是否从常规(非 ODBC)MySQL 客户端运行? 包裹select * (...) as foo
有帮助吗?注意:A、B、C 让我很奇怪,因为它没有做任何有用的事情......
原始 SQL 从 MS-Access 前端访问 ms-access 后端运行良好。原始 SQL 中有一个 Dateadd 函数,所以我将它移植到 MYSQL 并能够直接在 MYSQL 中运行查询。问题是我不能对用 ms-access 编码的查询使用 mysql 语法,所以我必须按原样使用原始查询。
我曾尝试选择HouseholdID,即Households中的PK,但仍然出现同样的错误。
对于常规的非 odbc 客户端,我的意思是命令行 mysql 工具、HeidiSQL 或类似的东西。我很确定 Microsoft Access 通过 ODBC 连接。
【参考方案1】:
在我的 Access 版本中,当我在设计 (SQL) 视图中编辑查询时,顶部有三个按钮。 “联合”、“传递”和“数据定义”。
如果我单击“传递”,您的查询将起作用。如果我单击“联合”它会中断。您可以在此查询中使用“Pass-Through”吗?
即使在“联合”或“数据定义”模式下,这似乎也有效:
(SELECT 1, column1 as A FROM Households H)
UNION ALL
(SELECT 2, column2 as A FROM Households H)
UNION ALL
(SELECT 3, column3 as A FROM Households H);
也许 Access 只被一列搞糊涂了?
或者,只需使用多路复用表而不是联合:
SELECT mux.id,
IIf(mux.id=1,column1,IIf(mux.id=2,column2,column3)) AS A
FROM Households, mux;
注意:mux 表中应该有 3 个值 1,2,3。如果它有更多,您希望限制在 where 子句中的前 3 个(或 n 个)。
【讨论】:
我不记得将 UNION 更改为 Pass-thru 时发生了什么。今晚我会试一试,然后告诉你。谢谢! 好的,我阅读了更多关于 Pass-through 的内容。这意味着 SQL 将直接在服务器(本例中为 mysql)上执行,而不是在 MS-Access 上的链接表上执行。所以,我将查询移植到 mysql 语法中,它运行良好!谢谢,您的意见让我继续前进! 我认为 UNION-type(ms-access option, not SQL UNION) 给出错误,因为它在访问本身上运行 SQL,所以不知何故 SQL 没有通过驱动程序正确转换为 mysql 格式. MS 官方定义 - *Union :一种 SQL 特定的选择查询,将两个或多个表或查询中的相应字段组合到一个字段中 Pass-Through b>:直接向 SQL 数据库服务器(如 Microsoft SQL Server)发送命令的 SQL 特定查询。通过传递查询,您可以使用服务器上的表,而不是将表链接到 Microsoft Access 数据库。 数据定义:可以创建或删除索引,或创建、更改或删除表的 SQL 特定查询【参考方案2】:这是一个已知的 MySQL 问题:more than two UNION SELECT statement problem (with MS Access),但我不知道问题出在 MSAccess SQL 解析器(编译为 ODBC SQL)还是在 MySQL ODBC 驱动程序(将 ODBC SQL 编译为 MySQL SQL )
要解决这个问题,我必须查看 ODBC 日志和 ODBC 规范,并查看 Access 是否发出了有效的 ODBC SQL。
那将是浪费精力,因为无论如何使用传递查询更有意义。在这个地方使用本机 MSAccess 查询的主要原因是连接到不同的数据源 - 例如,Excel 电子表格和 MySQL 表 - 根据 MySQL 错误报告上的 cmets,当你这样做。
【讨论】:
【参考方案3】:我不确定问题出在哪里,但我认为(尽管这只是一个假设)这是在 MS Access 方面。我有两个UNION
查询,每个查询都将其他一些查询放在一起。两者都使用了一些复杂的子查询,所以我在创建传递查询时遇到了很多问题,我不想使用 MySQL“视图”。
令人惊讶的是,我的一个查询有效,另一个显示错误。我的想法是,工作查询使用了一些 Access 功能,而另一个是某种 SELECT ... FROM
's 。
我不知道规则,但我认为当您的查询很简单时,Access 会将其发送到外部数据库引擎并再放置一个括号并导致错误。如果您执行复杂的查询,Access 会获取它需要的所有数据并自行执行所有必要的操作。例如,您可能会尝试创建一个使用 MSSQL TRANSFORM
语句的数据透视查询,这在 MySQL 中不存在,因此很明显 Access 会自己处理它。那么为什么它不能自己制作SELECT
呢?我不知道。也许是一些性能原因?
我的工作查询与其他查询不同,它有一个由内置 Access 函数计算的(字符串)字段。它还使用了 Access &
运算符,这在 MySQL 中有另一个含义(逻辑与)。 (顺便在 MySQL 中加入字符串使用CONCAT
函数)。它们当然需要由 Access 评估,因为 MySQL 不理解这种将字符串连接在一起的方法。
我建议不要从表中创建UNION
,而是从查询(如SELECT * FROM tablename
等等)中创建一个您不需要的字段,但这将强制Access 处理查询。所以一个查询(在 Access 中)应该是这样的:
SELECT tablename.*, [somefield1]&[somefield2] AS useless_field FROM tablename;
(在我的 Access 2000 中,"a" & "b"
或 IIf(true;true;false)
之类的操作可能已被简化和解决,因此它不起作用。我认为至少需要一个动态字段来评估。我也没有进行性能测试。可能如果你添加到整数会最快,也许只是将你的索引增加 1?)。
然后,当然,你们一起加入:
SELECT * FROM query1
UNION ALL
SELECT * FROM query2
UNION ALL
SELECT * FROM query3
UNION ALL
...
SELECT * FROM queryn
;
你当然不需要这个useless_field
。
我同意这是一种解决方法,但我没有其他想法。
【讨论】:
以上是关于使用 ODBC 连接到 MYSQL 在 MS-Access 中运行 SQL 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ODBC 将 Excel 连接到我的域中的在线 Mysql 数据库?
如何使用 OTL ODBC 驱动程序将 C++ 连接到 MySQL?