【问题标题】:Wide varchar field causes "Requested conversion is not supported" error using openquery with MySQL linked server使用带有 MySQL 链接服务器的 openquery 宽 varchar 字段导致“不支持请求的转换”错误
【发布时间】:2016-05-07 02:46:47
【问题描述】:

我正在尝试使用 openquery 将表从 MySql 迁移到 MSSQL,但我不断收到以下错误消息:

OLE DB provider "MSDASQL" for linked server "MYSQL" returned message "Requested conversion is not supported.".
Msg 7341, Level 16, State 2, Line 1
Cannot get the current row value of column "[MSDASQL].description" from OLE DB provider "MSDASQL" for linked server "MYSQL". 

我正在尝试运行的 SQL 查询:

insert into dbo.tickets (id, description, createdAt)
select * from openquery(MYSQL, 'select * from mydb.tickets')

openquery 我已经复制了几张表,但这张表欺骗了我。

在数据库的两侧,description 字段为varchar(8000)。 MySql中没有描述为空的行,最长的描述只有5031个字符。

我尝试在 MySql 中创建一个具有相同数据结构的新视图,但得到了相同的错误。 我无法确定哪一行的描述字段无效,因为该表包含超过 65000 行。

我也尝试将数据转储到 SQL 文件中,但我在 Management Studio 中得到了OutOfMemoryException。转储的 sql 文件本身约为 60 MB。

有什么建议或其他迁移这些数据的方法吗?

提前致谢!

【问题讨论】:

  • 尝试使用不同版本的 MySQL OLE DB Provider。
  • 我在 FoxPro 驱动程序中遇到了类似的问题,只能通过找到攻击行并在 FoxPro 侧更改它来解决(我遇到了超出正常范围的日期问题)。虽然看起来太难了,但如果您尝试按一半查询过滤(从 65.000 -> 32.000 -> 16.000 -> 8.000 -> 4.000 -> 2.000 -> 1.000 -> 500 -> 250 -> 125 传递,您可以很快找到它-> 62 -> 到 31 只需要 14 次拍摄)。
  • 谢谢各位!似乎将数据类型从 varchar 更改为 text 有效!

标签: mysql sql sql-server odbc openquery


【解决方案1】:

在我的测试中,我发现添加CAST(field as char(4000))也解决了这个问题。

我在 MySQL 5.1 数据库中创建了以下内容:

create table tmp_patrick (summary_text varchar(4096));
insert into tmp_patrick values ('foo');

当我在 SQL Server 2008 R2 SP1 (10.50.2500) 上执行以下操作时,使用 MySQL ODBC 驱动程序 64 位,版本 5.1 或 5.2w:

select * from openquery(MYSQL, 'select summary_text from scratch.tmp_patrick')

它会产生错误:

OLE DB provider "MSDASQL" for linked server "MYSQL" returned message "Requested conversion is not supported.".
Msg 7341, Level 16, State 2, Line 1
Cannot get the current row value of column "[MSDASQL].summary_text" from OLE DB provider "MSDASQL" for linked server "MYSQL". 

但如果我添加CAST:

select * from openquery(MYSQL, 'select CAST(summary_text as char(4000)) from scratch.tmp_patrick')

然后就可以了。转换为 char(4001) 将失败。

我不清楚 4000 个字符的限制来自哪里。

【讨论】:

  • 我想知道 4000 个字符的限制是否是因为 SQL Server 试图将数据转换为 NVARCHAR,它有 4000 个字符的限制。可能也值得尝试转换为VARCHAR(MAX)NVARCHAR(MAX);这可能会在不减少数据的情况下避免问题,但我没有链接的 MySQL 服务器来自己测试......
【解决方案2】:

我设法通过在 MySql 和 MSSQL 端将数据类型更改为 TEXT 来解决此问题。

【讨论】:

  • 他们正在贬低 MSSQL 中的 text 数据类型 - 现在您的数据已经存在,除非您计划再次导入该列,否则您可能应该将列类型更改回 varchar。请参阅警告here
  • 没问题 - 请记住将此答案标记为实际答案(当它允许您时),以便其他人知道它已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多