插入到超链接服务器MS SQL的第一列->;MySQL总是空字符串
我有一台MS SQL 2005服务器,它使用ODBC Connector 5.1.8驱动程序将服务器连接到MySQL 5.1.46服务器 我想从一个MS SQL作业中,根据结构相同的本地MS SQL表中包含的记录截断并重建一个远程MySQL表插入到超链接服务器MS SQL的第一列->;MySQL总是空字符串,sql,mysql,sql-server,Sql,Mysql,Sql Server,我有一台MS SQL 2005服务器,它使用ODBC Connector 5.1.8驱动程序将服务器连接到MySQL 5.1.46服务器 我想从一个MS SQL作业中,根据结构相同的本地MS SQL表中包含的记录截断并重建一个远程MySQL表 Key_ID varchar(10) NOT NULL Primary FieldA varchar(64) FieldB text Key_ID FieldA FieldB ====== ====== ====== ID1
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”说“replicate entry”“”。“如果我删除主键,它将添加所有记录,但远程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
Dummy Key_ID FieldA FieldB
===== ====== ====== ======
ID1 A A
ID2 B B
ID3 C C
这完全没有道理
如果我在远程MySQL表的开头添加一个伪字段,然后修改查询以在其中插入一个文本值或NULL,那么该字段总是以空字符串的形式出现,并且我的Key_ID字段按预期返回
Dummy varchar(64)
Key_ID varchar(10) NOT NULL Primary
FieldA varchar(64)
FieldB text
及
返回
Key_ID FieldA FieldB
====== ====== ======
A A
B B
C C
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从text改为varchar,一切都按照预期完美地开始工作。(当然,我必须潜在地截断原始MySQL表中的数据,但在我的情况下,这并不是什么大问题。)
令人费解的是,即使在我重新定义数据类型之前,FieldB字段仍然正确插入,并且没有指出它的存在是问题所在。如果更改
OPENQUERY( REMOTESERVER, 'SELECT * FROM DB1.Table1' )
对
OPENQUERY( REMOTESERVER, 'SELECT Key_ID, FieldA, FieldB FROM DB1.Table1' )
我刚刚遇到了同样的问题,我认为问题与表中最后一列的MySQL文本类型有关 假设我有下表:
CREATE TABLE `Test` (
`id` int(11) NOT NULL DEFAULT '0',
`field1` int(11) DEFAULT NULL,
`field2` varchar(16) DEFAULT NULL,
`field3` varchar(16) DEFAULT NULL,
`field4` varchar(1) DEFAULT NULL,
`field5` varchar(200) DEFAULT NULL,
`field6` text,
`field7` text,
`field8` text,
`field9` text,
`field10` text,
`field11` text,
`field12` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在SQL Server上,我执行以下操作(test和db.dbo.test具有相同的模式):
然后id、字段1到字段5将变为空,字段6到字段12将具有正确的数据
如果我这样做:
INSERT OPENQUERY (MYSQL_LINK, 'SELECT id, field1, field2, field3, field4, field5 FROM test) SELECT id, field1, field2, field3, field4, field5 FROM db.dbo.test
然后id和字段1至字段5将具有正确的数据
如果我声称在字段6中也插入了id,则id将变为空。如果我插入字段7,那么字段2也将变为NULL,依此类推
我一直在使用OPENQUERY将几十个MSSQL表毫无问题地传输到MySQL。
在查看其他表模式之后,我注意到在MySQL中没有一个表以文本类型结尾。所以我对MySQL模式做了一点修改,在末尾添加了一个整数列,瞧!成功了
CREATE TABLE `Test_new` (
`id` int(11) NOT NULL DEFAULT '0',
`field1` int(11) DEFAULT NULL,
`field2` varchar(16) DEFAULT NULL,
`field3` varchar(16) DEFAULT NULL,
`field4` varchar(1) DEFAULT NULL,
`field5` varchar(200) DEFAULT NULL,
`field6` text,
`field7` text,
`field8` text,
`field9` text,
`field10` text,
`field11` text,
`field12` text,
`field13` int(11) NOT NULL DEFAULT '0',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以及查询:
INSERT OPENQUERY (MYSQL_LINK, 'SELECT * FROM test_new') SELECT *,0 FROM db.dbo.test
我不知道我应该在哪里解决这个问题。是MSSQL OPENQUERY错误还是MySQL连接器错误?我不知道。但我希望我的发现能帮你们节省一些调试时间
INSERT INTO `DB1`.`Table1` ( `FieldB`,`Dummy`, `Key_ID`, `FieldA`) VALUES ('A', DEFAULT, 'ID1', 'A' )
如果将文本列移到顶部,问题就解决了。我看到在Sql Server中有一个主键
varchar(10)
。它是Mysql中的varchar吗?是的,所有字段的表结构都相同。Key_ID在这两个地方都是varchar(10)PRIMARY。当您运行Select*from RemoteServer..DB1.Table1
vsSelect*from OpenQuery(RemoteServer,'Select*from DB1.Table1')
,ODBC驱动程序不允许我这样查询。“提供了一个由四部分组成的名称,但提供程序没有公开使用目录或架构所需的接口。”我所知道的查询它的唯一方法是通过OPENQUERY或EXECUTE。两者都返回相同的内容,就像直接进入服务器并在那里查询一样。。。如果是这样的话,请从RemoteServer中选择*…表1
?解决方案就到此为止。如果在insert中“交换”列顺序(不添加新列),只需将整型列保留在末尾(即insert OPENQUERY(MYSQL_链接,'SELECT…,id FROM test_new'),该解决方法仍然有效这已经在另一个答案中得到了证明。虽然尝试贡献您的知识很好,但这并不是一个新的答案,我建议删除它。如果您发现现有答案不清楚,添加关于如何更新的注释将是一个更好的解决方案。