+ -
当前位置:首页 → 问答吧 → sql server2005 提取Mysql数据库数据并写入本地

sql server2005 提取Mysql数据库数据并写入本地

时间:2011-11-29

来源:互联网

之前用的是这种方式:
建立链接服务器TEST,通过链接服务器访问Mysql库
DECLARE @id int
SET @id=(select max(uid) from localmember)
print @uid
IF @uid IS NULL
SET @uid=1
INSERT INTO localmember
SELECT * FROM OPENQUERY(TEST,'SELECT members.uid,FROM_UNIXTIME(regdate) AS regdate FROM members')
WHERE uid>@uid
是可以实现,但存在一个问题,如果Mysql里members表的数据非常多,这个时候产生的网络流量是非常大的,猜测是Sql server把Mysql的数据全部取回在放到临时表里筛选。
后来用动态执行Sql的方法:

DECLARE @uid int
SET @uid=(select max(uid) from localmember)
print @uid
IF @uid IS NULL
SET @uid=1
  insert into localmember
  EXEC ('SELECT members.uid,FROM_UNIXTIME(regdate) AS regdate FROM uc_members
  where members.uid >?', @uid) AT TEST

就报了如下错误:
链接服务器"TEST"的 OLE DB 访问接口 "MSDASQL" 返回了消息 "[MySQL][ODBC 5.1 Driver]Optional feature not supported"。
消息 7391,级别 16,状态 2,第 6 行
无法执行该操作,因为链接服务器 "TEST" 的 OLE DB 访问接口 "MSDASQL" 无法启动分布式事务。


请问有什么解决办法?第一种方法流量过大会影响Mysql数据库的运行。

作者: songtopro   发布时间: 2011-11-29

急呀,各位大侠快支招哇。。。。

作者: songtopro   发布时间: 2011-11-29

SQL code
INSERT INTO localmember
SELECT * FROM OPENQUERY(TEST,'SELECT members.uid,FROM_UNIXTIME(regdate) AS regdate FROM members where uid>'+ltrim(@uid))

作者: qianjin036a   发布时间: 2011-11-29

此方法不行,经测试OPENQUERY()括号内不允许带参数where uid>'+ltrim(@uid))
准确的说传给Mysql的查询语句不允许带参数,写成where uid>1000‘到还是可以
引用 2 楼 qianjin036a 的回复:
SQL code
INSERT INTO localmember
SELECT * FROM OPENQUERY(TEST,'SELECT members.uid,FROM_UNIXTIME(regdate) AS regdate FROM members where uid>'+ltrim(@uid))

作者: songtopro   发布时间: 2011-11-29

还是OPENQUERY()里不允许带参数,参数要在括号外面
@sql='selct * from members'
SELECT * FROM OPENQUERY(TEST,@sql)
这样都不行

作者: songtopro   发布时间: 2011-11-29

不允许带参数就直接全部导过来 再过滤

作者: rucypli   发布时间: 2011-11-29

难道需要显式启动分布式事务?

作者: fredrickhu   发布时间: 2011-11-29

begin distributed tran 
。。。  
commit tran

作者: fredrickhu   发布时间: 2011-11-29

热门下载

更多