我有一个 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/