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

标签 mysql sql-server ssis odbc mysql-odbc-connector

我有一个 SSIS 包,用于将数据从 MySQL 数据库导出到 SQL 数据库。 出于某种原因,我只能使用 ODBC 源项读取数据,但无法预览表格,而且在进行其他一些测试时,我发现我也无法使用 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);更改数据库、表和列编码;更改 ODBC 源项目中的数据访问模式(默认使用“表名”);重做任务。一切都会导致相同的错误,即使在不同的计算机和数据库上也是如此。

编辑:

使用@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.

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

最佳答案

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

(1) 连接MySQL问题

在此链接中,作者提到了两种连接 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.

其他类似链接

关于mysql - 如何修复 SSIS 中的 ODBC Driver 8.0 SQL 语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54603370/

相关文章:

sql-server - 如何在 SQL Server 2005 中将十六进制字符串转换为二进制?

sql-server - select top 10 ... 和 select top 30 遵循不同的执行计划

c# - 将一个表的所有行复制到另一个表

sql-server - 如何使用 T-SQL 列出 Sql Server 2008 上的所有 SSIS 包

sql-server - Select 语句从 Netezza 数据库获取数据并将其插入 SQL Server 数据库 (SSIS)

mysql - 语法错误 MySQL 更新

php - Print_r 只显示第一行

php - 我应该如何在mysql数据库中存储一系列数据?

使用 HTML 变量进行 PHP 分页

debugging - SSIS Script Task抛出异常,如何查看消息?