test,資料表:testtable (id, name, age)MySQLLink (自訂)MySQL (任意字串)Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=test;User=root;Password=root;Option=3;EXEC master.dbo.sp_addlinkedserver
@server = N'MySQLLink',
@srvproduct = N'MySQL',
@provider = N'MSDASQL',
@provstr = N'Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=test;Uid=root;Pwd=root;Option=3;';
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'MySQLLink',
@useself = N'False',
@locallogin = NULL, -- NULL 表示所有本地登入對應同一遠端帳號
@rmtuser = N'root',
@rmtpassword = N'root';
OPENQUERY 接受連結伺服器名稱與在遠端執行的 SQL 陳述式,支援查詢、插入、更新、刪除:
SELECT * FROM OPENQUERY(MySQLLink, 'SELECT id, name, age FROM testtable');
INSERT INTO OPENQUERY(MySQLLink, 'SELECT id, name, age FROM testtable')
VALUES (1, N'Peter', 30);
UPDATE OPENQUERY(MySQLLink, 'SELECT id, name, age FROM testtable')
SET name = N'Jone' WHERE id = 1;
DELETE FROM OPENQUERY(MySQLLink, 'SELECT id, name, age FROM testtable')
WHERE id = 1;
SELECT * FROM MySQLLink...test.testtable,但 OPENQUERY 效能通常更佳(遠端執行完整查詢,僅傳回結果集)。sp_executesql 避免注入,動態建構 OPENQUERY 字串。utf8mb4,SQL Server 使用 Unicode (nvarchar),透過 ODBC 驅動通常自動轉碼,但需留意補充字元處理。| 錯誤現象 | 可能原因 | 解決方向 |
|---|---|---|
| 找不到提供者 | 未安裝或位元數不符的 ODBC 驅動 | 安裝對應版本 MySQL ODBC Driver |
| 登入失敗 | 帳密錯誤、MySQL 未授權遠端連線 | GRANT ALL ON test.* TO 'root'@'%'; FLUSH PRIVILEGES; |
| 查詢中文亂碼 | 字元集不匹配 | 連線字串加入 CharSet=utf8mb4,確認資料表/欄位定義 |
| 大量資料插入緩慢 | 逐筆 INSERT | 改用批次 INSERT 或 SSIS/BCP 匯入 |
透過 MSDASQL + MySQL ODBC Driver 建立連結伺服器,配合 OPENQUERY 即可在 SQL Server 內以 T-SQL 直接操作 MySQL,實現異構資料庫整合查詢、ETL 搬移、報表聯查等需求。關鍵在於驅動程式版本一致、權限正確、善用遠端下推優化效能。