没有。不是来自 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 查询中提取结果以填充该表。这对我来说是最有效的。
我的存储过程中的一些 sn-ps:
我留下了关于启用链接服务器需要做什么的评论(我只需要对 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 上创建一个临时表 (#table)服务器,然后用 MySQL 查询的结果填充它,然后从临时表中处理。