連結伺服器 讓 SQL Server 能對異質 OLE DB/ODBC 資料來源執行分散式查詢。本文彙整六大常見連結對象的建立與查詢語法,含提供者選擇、驅動程式安裝、登入對應與實戰注意事項。
MySQL Connector/ODBC)。myDSN,指向目標 MySQL 資料庫。EXEC sp_addlinkedserver
@server = 'MySQLTest',
@srvproduct = 'MySQL',
@provider = 'MSDASQL',
@datasrc = 'myDSN';
GO
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'MySQLTest',
@useself = 'false',
@locallogin = 'sa',
@rmtuser = 'mysql_user',
@rmtpassword = 'mysql_pwd';
GO
-- 必須使用 OPENQUERY SELECT * FROM OPENQUERY(MySQLTest, 'SELECT * FROM `table_name`'); -- 錯誤寫法:四部分命名不支援 MySQL -- SELECT * FROM MySQLTest...table_name
EXEC sp_addlinkedserver
@server = 'OraLink',
@srvproduct = 'Oracle',
@provider = 'MSDAORA',
@datasrc = 'Oracle_TNS_Name';
GO
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'OraLink',
@useself = 'false',
@locallogin = 'sa',
@rmtuser = 'ora_user',
@rmtpassword = 'ora_pwd';
GO
-- 四部分命名(全部大寫) SELECT * FROM OraLink..SCHEMA_NAME.TABLE_NAME; -- 執行預存程序 SELECT * FROM OPENQUERY(OraLink, 'BEGIN schema.proc_name; END;');
EXEC sp_addlinkedserver
@server = 'txtsrv',
@srvproduct = 'Jet 4.0',
@provider = 'Microsoft.Jet.OLEDB.4.0',
@datasrc = 'C:\Data\TextFiles',
@provstr = 'Text';
GO
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'txtsrv', @useself = 'false', @locallogin = 'sa', @rmtuser = 'Admin', @rmtpassword = NULL;
GO
-- 查詢(需同目錄下有 schema.ini 定義欄位格式)
SELECT * FROM txtsrv...[file1#txt];
EXEC sp_addlinkedserver
@server = 'SQLLink',
@provider = 'SQLNCLI11', -- 或 SQLOLEDB
@datasrc = '192.168.1.200'; -- 遠端 IP/主機名
GO
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'SQLLink',
@useself = 'false',
@locallogin = 'sa',
@rmtuser = 'remote_user',
@rmtpassword = 'remote_pwd';
GO
-- 四部分命名直接查詢
SELECT * FROM SQLLink.RemoteDB.dbo.RemoteTable;
INSERT LocalDB.dbo.LocalTable SELECT * FROM SQLLink.RemoteDB.dbo.RemoteTable;
SELECT * INTO LocalDB.dbo.NewTable FROM SQLLink.RemoteDB.dbo.RemoteTable;
EXEC sp_addlinkedserver
@server = 'SQLLinkODBC',
@provider = 'MSDASQL',
@provstr = 'DRIVER={SQL Server};SERVER=192.168.1.200;UID=remote_user;PWD=remote_pwd;';
GO
EXEC sp_addlinkedserver
@server = 'AccessLink',
@provider = 'Microsoft.Jet.OLEDB.4.0',
@datasrc = 'C:\Data\Northwind.mdb';
GO
SELECT * FROM AccessLink...TableName;
EXEC sp_addlinkedserver
@server = 'SybaseLink',
@provider = 'MSDASQL',
@provstr = 'Driver={Sybase System 11};Database=hisdb;Srvr=10.211.135.12;UID=sa;PWD=1111;';
GO
SELECT * FROM SybaseLink.hisdb.dbo.table1;
| 限制 | 說明 | 因應 |
|---|---|---|
SET IDENTITY_INSERT 不支援跨連結伺服器 | 無法遠端開啟身分插入 | 在遠端伺服器本機執行 |
SELECT * INTO 跨連結伺服器可能失敗 | 中繼資料鎖定衝突 | 先在本地建立目標表,再 INSERT ... SELECT |
| 分散式交易 (MSDTC) 必須啟用 | 跨伺服器 UPDATE/INSERT/DELETE 需 MSDTC | 服務管理員啟用 MSDTC、防火牆開 135/動態埠 |
| 四部分命名不支援 MySQL/Oracle/文字檔 | 僅 SQL Server 間支援 | 統一使用 OPENQUERY 或 OPENROWSET |
| 效能:遠端篩選下推 | 盡量在 OPENQUERY 內完成 WHERE/JOIN | 避免拉回大量資料再本地過濾 |
EXEC sp_droplinkedsrvlogin 'LinkName', 'local_login'; EXEC sp_dropserver 'LinkName', 'droplogins';