我知道这个问题很愚蠢,但我不得不问它有办法将mysql数据库表连接到mssql数据库表吗?
我有一个mysql表,需要从旧的SQL 2000数据库服务器中的表中获取数据,它有一种方法可以自动连接它们,以便每次在旧服务器中添加或更新时自动获取数据吗?
有没有办法自动连接它们? 我使用一个应用程序来复制旧的数据并每隔6秒将其添加到新数据中,但这很痛苦,因为有时它关闭了这个小应用程序,一切都变得一团糟。
答案 0 :(得分:1)
没有。不是来自MySQL内部。连接到远程数据库(例如SQL Server,
)没有内置功能但是可以让SQL Server与MySQL数据库进行通信。我有使用SQL Server 2005 Standard和MySQL 5.1。
我必须使用从MySQL下载的MySQL ODBC驱动程序在SQL Server系统上设置ODBC数据源。 (运行odbcad32进行设置,或者您可能需要等效的64位)。
我必须在SQL Server中启用一些配置选项,允许远程过程调用和结果。
我在SQL Server 2005中创建了一个引用ODBC数据源的LINKED SERVER。 (我认为还有一些设置我必须在ODBC数据源中进行调整。
使用该设置,"技巧"实际上是神秘的Transact-SQL构造,有几种方法可以做到,有些方法比其他方法有更好的性能。 (我设计它不会用大量数据压倒内存,我们以可管理的块进行传输。)
我没有必要推动"从SQL Server到MySQL;我正在做一个"拉"从MySQL到SQL Server的数据。但我认为相同的设置可以用于执行INSERT和UPDATE语句。
要将结果集从MySQL检索到SQL Server,我创建了一个本地临时表(在SQL Server上),并从MySQL查询中提取结果以填充该结果。这对我来说效果最好。
我的存储过程中的一些代码段:
评论我留下了关于启用链接服务器需要做些什么(我只需要对MySQL执行SELECT语句。)
-- -- to enable RPC for a linked server
-- exec sp_helpserver
-- exec sp_serveroption @server='LOCALHOST_MYSQL_xxxx_RO', @optname='rpc', @optvalue='true'
-- exec sp_serveroption @server='LOCALHOST_MYSQL_xxxx_RO', @optname='rpc out', @optvalue='true'
-- exec sp_helpserver
-- mysql database from which we retrieve interval data
DECLARE @linked_server_name NVARCHAR(255)
SET @linked_server_name = N'[LOCALHOST_MYSQL_xxxx_RO]'
IF OBJECT_ID(N'tempdb..#t_pxxxx') IS NOT NULL DROP TABLE #t_pxxxx
CREATE TABLE #t_pxxxx ( pxxxx_xxxx_id BIGINT, ...
DECLARE @s_query NVARCHAR(MAX);
SET @s_query = 'SELECT r.id AS pxxx_xxxx_id, ... ';
DECLARE @stmt NVARCHAR(MAX);
SET @stmt = N'INSERT INTO #t_pxxxx
SELECT * FROM OPENQUERY(' + @linked_server_name + N','''
+ REPLACE(@s_query,'''','''''') + N''' ) ORDER BY 1';
-- for debug, show the SQL statement
-- PRINT N'@stmt: ' + @stmt;
-- populate #t_pxxxx (local temporary table) from source
TRUNCATE TABLE #t_pxxxx;
EXECUTE(@stmt);
我使用@tables
和#tables
测试了几个变体,这些变体的实际机制如何有所不同......最适合我的是创建一个临时表(#表)在SQL Server上,然后使用MySQL查询的结果填充它,然后从临时表进行处理。