5

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

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

ERROR [42000] [MySQL][ODBC 8.0(w) Driver][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'

错误变为警告。

设置 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 个不同的连接来完成。

4

1 回答 1

3

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

(1) 连接 MySQL 问题

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

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

(2) 写入 MySQL 问题

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

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

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

其他类似链接

于 2019-02-09T23:05:28.497 回答