sql - INSERT INTO over linked server MS SQL -> MySQL 的第一列总是空字符串

标签 sql mysql sql-server

我有一个 MS SQL 2005 服务器,它使用 ODBC 连接器 5.1.8 驱动程序通过链接服务器连接到 MySQL 5.1.46 服务器。

我想从一个 MS SQL 作业截断然后重建一个远程 MySQL 表,该表基于结构相同的本地 MS SQL 表中包含的记录。

Key_ID  varchar(10)  NOT NULL  Primary
FieldA  varchar(64)
FieldB  text

Key_ID   FieldA   FieldB
======   ======   ======
ID1      A        A
ID2      B        B
ID3      C        C

问题是,当我从 MS SQL 运行以下查询时,我收到一条错误消息:“键‘PRIMARY’的重复条目‘’。”如果我删除主键,它会添加所有记录,但远程 MySQL Key_ID 字段总是返回一个空字符串,即使本地表中没有记录是 NULL 或空字符串也是如此。

EXECUTE ('DELETE FROM DB1.Table1') AT REMOTESERVER

INSERT INTO
 OPENQUERY( REMOTESERVER, 'SELECT * FROM DB1.Table1' )
SELECT
 Key_ID,
 FieldA,
 FieldB
FROM
 Table1

返回

Key_ID   FieldA   FieldB
======   ======   ======
         A        A
         B        B
         C        C

这完全没有意义。

如果我在远程 MySQL 表的开头添加一个虚拟字段,然后修改我的查询以在其中插入文字值或 NULL,该字段总是以空字符串出现,并且我的 Key_ID 字段按预期返回。

Dummy   varchar(64)
Key_ID  varchar(10)  NOT NULL  Primary
FieldA  varchar(64)
FieldB  text

EXECUTE ('DELETE FROM DB1.Table1') AT REMOTESERVER

INSERT INTO
 OPENQUERY( REMOTESERVER, 'SELECT * FROM DB1.Table1' )
SELECT
 'srsly wtf?',
 Key_ID,
 FieldA,
 FieldB
FROM
 Table1

返回

Dummy   Key_ID   FieldA   FieldB
=====   ======   ======   ======
        ID1      A        A
        ID2      B        B
        ID3      C        C

据我所知,最左边的第一列总是返回一个空字符串。有没有人知道为什么,或者可以给我一些解决方法的想法,这些解决方法不涉及除了充当缓冲字段之外没有任何作用的虚拟字段?

更新: 我在 ODBC 驱动程序上启用了调试日志记录,发现它将我的 SQL 语句翻译成:

INSERT INTO `DB1`.`Table1` (`Key_ID`, `FieldA`, `FieldB`) VALUES ( DEFAULT, 'A', 'A' )

如果我添加虚拟字段,它会运行:

INSERT INTO `DB1`.`Table1` (`Dummy`, `Key_ID`, `FieldA`, `FieldB`) VALUES ( DEFAULT, 'ID1', 'A', 'A' )

除了驱动程序假设第一个提供的字段始终是一个递增的主键之外,我不知道现在该怎么想?

最佳答案

我找到了我自己问题的答案。

问题在于 FieldB 是文本数据类型。

我将 MySQL Table1.FieldB 从文本更改为 varchar,一切都按预期开始完美运行。 (当然,我不得不截断原始 MySQL 表中的数据,但在我的情况下这不是什么大问题。)

令人困惑的是,即使在我重新定义数据类型之前,FielDB 字段仍然正确插入,并且没有迹象表明它的存在是问题所在。

关于sql - INSERT INTO over linked server MS SQL -> MySQL 的第一列总是空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4381625/

相关文章:

sql - 在 mySQL 中将字符串格式化为日期

mysql - 如何删除 mySQL 中表中的所有条目并将其替换为另一个表中的值?

php - 为此创建 MySQL 查询的最佳方法

c# - 使用 sp_executesql 运行时相同的 SQL 查询很快,如果在查询分析器中作为动态查询执行则非常慢,为什么?

c# - MySQL 和 SQL Server 的 IDbCommand 命名参数

php - 在 PHP 中执行参数化查询的最佳实践?

php - 将四张表合并为一张新表

c# - OraOLEDB.Oracle 提供程序未在本地计算机上注册

php - SELECT 查询输出每个结果六次

c# - Entity Framework 查询性能与原始SQL执行的极端不同