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

How to fix ODBC Driver 8.0 SQL syntax error in SSIS?

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

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

ERROR [42000] [MySQL][ODBC 8.0(w) Driver][mysqld-5.7.23]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "TABLENAME" at line 1 (myodbc8w.dll).

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

编辑:

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

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

Error Code: 1231. Variable 'sql_mode' can't be set to the value of '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 row(s) affected, 1 warning(s): 3135 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.

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

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

(1) 连接到 MySQL 问题

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

Switching to use a SQL query instead, and that worked just fine. I was able to pull back both the correct metadata, with one small problem - the varchar(50) columns came back with a length of 51. This resulted in some warnings, but the package ran correctly.

(2) 写入 MySQL 问题

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

For the ADO.NET Destination to work properly, the MySQL database needs to have the ANSI_QUOTES SQL_MODE option enabled. This option can be enabled globally, or for a particular session. To enable it for a single session:

  1. Create an ADO.NET Connection Manager which uses the ODBC driver
  2. Set the connection manager’s RetainSameConnection property to True
  3. Add an Execute SQL Task before your data flow to set the SQL_MODE – Ex. set sql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ANSI_QUOTES'
  4. Make sure that your Execute SQL Task and your ADO.NET Destination are using the same connection manager.

其他类似的links

  • SSIS problems with MySQL Connector/ODBC 5.3.8
  • SSIS and MySQL - Table Name Delimiter Issue