SQL Server 連結伺服器允許在 T-SQL 中直接查詢異構資料來源 (Oracle、MySQL、PostgreSQL、Excel、文字檔等)。本文以 MySQL ODBC 驅動程式 為例,完整說明驅動安裝、系統 DSN 設定、連結伺服器建立 (GUI 與 T-SQL)、安全性對應、查詢語法與常見錯誤排查。
MySQL_Link (自訂,連結伺服器將引用此名稱)常見錯誤:使用「使用者 DSN」建立連結伺服器時,SQL Server 服務帳戶 (通常是 Local System/Network Service) 看不見使用者 DSN,報錯 Data source name not found and no default driver specified。務必用系統 DSN。
MYSQL_LINK (自訂,查詢時使用)MySQL_Link (步驟 2 的系統 DSN 名稱)UID=mysql_user;PWD=mysql_password (或留空由 DSN 提供)EXEC sp_addlinkedserver
@server = 'MYSQL_LINK',
@srvproduct = 'MySQL',
@provider = 'MSDASQL',
@datasrc = 'MySQL_Link'; -- 系統 DSN 名稱
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'MYSQL_LINK',
@useself = 'FALSE',
@locallogin = NULL, -- 所有本機登入對應同一組遠端認證
@rmtuser = 'mysql_user',
@rmtpassword = 'mysql_password';
SELECT * FROM OPENQUERY(MYSQL_LINK, 'SELECT id, name, created_at FROM users WHERE status = 1 LIMIT 100');
SELECT * FROM MYSQL_LINK...users; -- 資料庫名稱需確認
-- 或
SELECT * FROM MYSQL_LINK.`database_name`.`users`;
DECLARE @status INT = 1;
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM OPENQUERY(MYSQL_LINK, ''SELECT id, name FROM users WHERE status = ?'')';
-- 注意:OPENQUERY 不支援參數化,需動態組裝字串 (注意單引號跳脫)
-- 實務上建議在 MySQL 建立 View/SP,OPENQUERY 呼叫 View/SP
SELECT s.OrderID, s.CustomerID, u.Email
FROM LocalDB.dbo.Orders s
JOIN OPENQUERY(MYSQL_LINK, 'SELECT UserID, Email FROM users') u
ON s.CustomerID = u.UserID;
INSERT OPENQUERY(MYSQL_LINK, 'SELECT UserID, Email FROM users')
VALUES (999, 'new@example.com');
UPDATE OPENQUERY(MYSQL_LINK, 'SELECT UserID, Email FROM users WHERE UserID = 999')
SET Email = 'updated@example.com';
| 錯誤訊息 | 原因 | 解決 |
|---|---|---|
| Data source name not found... | 用使用者 DSN、DSN 名稱錯誤、架構不符 (32/64-bit) | 改用系統 DSN、確認架構一致 |
| Cannot initialize the data source object... | MySQL 伺服器不可達、連接埠封鎖、帳戶無遠端權限 | 檢查網路、防火牆、MySQL GRANT ... @'%' |
| OLE DB provider "MSDASQL" reported error... | 驅動版本不符、字元集編碼問題 | 升級驅動、DSN 設定 charset=utf8mb4 |
| Distributed transaction error (MSDTC) | 跨伺服器寫入需分散式交易 | 啟用 MSDTC、或改用 OPENQUERY 單向寫入 |
GRANT SELECT ON LinkedServer::MYSQL_LINK TO [AppRole]sys.dm_exec_connections 連結伺服器連線數