如何修复 SSIS 中的 ODBC Driver 8.0 SQL 语法错误?

use*_*347 5 mysql sql-server odbc ssis mysql-odbc-connector

我有一个 SSIS 包,用于将数据从 MySQL 数据库导出到 SQL 数据库。由于某种原因,我只能使用 ODBC 源项读取数据,但无法预览表,而且在进行其他一些测试时,我发现也无法使用 ODBC 目标项插入数据。

每当我尝试时,我都会收到此错误:

错误 [42000] [MySQL][ODBC 8.0(w) 驱动程序][mysqld-5.7.23]您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解TABLENAME在第 1 行 (myodbc8w.dll) 的“”附近使用的正确语法。

我正在使用 MySQL 5.7.23 和 MySQL Connector/ODBC 8.0。我尝试过在 ANSI 和 Unicode 连接器之间切换;降级连接器版本(尝试过 5.3、5.2 和 5.1);更改数据库、表和列编码;更改 ODBC Source 项中的数据访问模式(默认使用“表名称”);重新做任务。即使在不同的计算机和数据库上,一切都会导致相同的错误。

编辑:

使用@Hadi 第二种解决方法会产生一些有趣的结果(第一个解决方法对我不起作用)。

使用 ADO.NET 或 ODBC 连接器时,提供的查询会导致错误。

错误代码:1231。变量“sql_mode”无法设置为“NO_AUTO_CREATE_USER”的值

将查询修改为后

set sql_mode = 'STRICT_TRANS_TABLES, NO_ENGINE_SUBSTITUTION, ANSI_QUOTES'

错误更改为警告。

set sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ANSI_QUOTES' 0 行受影响,1 条警告:3135 'NO_ZERO_DATE'、'NO_ZERO_IN_DATE' 和 'ERROR_FOR_DIVISION_BY_ZERO' sql 模式应与严格模式一起使用。它们将在未来的版本中与严格模式合并。

尽管如此,它还是部分起作用了。任何选定表名称周围的任何引号、重音符号或任何其他符号都必须删除。这使得它在插入数据时工作正常,但在检索数据时,必须通过 SQL 命令或创建 2 个不同的连接来完成。

Had*_*adi 4

在搜索问题时,我发现了一些有用的链接,其中提到了一些解决方法:

\n\n

(1)连接MySQL问题

\n\n\n\n

在此链接中,作者提到了两种连接 MySQL 的方法(使用 ODBC 和 ADO.net)。他提到,在尝试使用 ODBC 检索表时,他收到了与您在问题中列出的相同的错误,他提到了解决方案如下:

\n\n
\n

改用 SQL 查询,效果很好。我能够拉回正确的元数据,但有一个小问题 - varchar(50) 列返回的长度为 51。这导致了一些警告,但包运行正确。

\n
\n\n

(2)写入MySQL问题

\n\n\n\n

在这篇文章中,作者提到了如何使用 ADO.Net 目标写入 MySQL 目标,他提到了以下解决方案:

\n\n
\n

为了使 ADO.NET 目标正常工作,MySQL 数据库需要启用 ANSI_QUOTES SQL_MODE 选项。该选项可以全局启用,也可以针对特定会话启用。要为单个会话启用它:

\n\n
    \n
  1. 创建使用 ODBC 驱动程序的 ADO.NET 连接管理器
  2. \n
  3. 将连接管理器\xe2\x80\x99sRetainSameConnection属性设置为True
  4. \n
  5. 在数据流之前添加一个Execute SQL Task以设置 SQL_MODE \xe2\x80\x93set sql_mode=\'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ANSI_QUOTES\'
  6. \n
  7. 确保您的执行 SQL 任务和您ADO.NET Destination使用的是相同的连接管理器。
  8. \n
\n
\n\n

其他类似链接

\n\n\n

  • 好吧,看来进行更改的人没有很好地解释发生了什么。除了必须从查询中删除 NO_AUTO_CREATE_USER 以及我在编辑中解释的一些细微更改之外,第二种解决方法工作得很好。ADO.NET 连接工作正常。非常感谢你的帮助。 (3认同)
  • 好吧,这会带来一些有趣的结果。检查我的编辑。 (2认同)