mssql version:sql server 2008
mysql version:mysql-5.1.32
1,安裝MSDASQL
--安裝MSDASQL(64 位元 OLEDB Provider for ODBC (MSDASQL))
--http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=zh-cn
--select the version WindowsServer2003.WindowsXP-KB948459-v2-x64-ENU.exe
2,安裝mysql
odbc --mysql-connector-odbc-5.1.6-winx64.msi
3,介面區配置器,註冊網路
EXEC
sp_configure 'show advanced option',1
RECONFIGURE
go
exec sp_configure
'Ad Hoc Distributed Queries',1
GO
RECONFIGURE
GO
4,建立MYSQL連結的伺服器
--用於從mysql擷取資料
EXEC
master.dbo.sp_addlinkedserver
@server = N'MYSQL',
@srvproduct=N'MySQL',
@provider=N'MSDASQL', @provstr=N'DRIVER={MySQL ODBC 5.1 Driver}; SERVER=ip; DATABASE=dbname; USER=username; PASSWORD=password; OPTION=3'
SELECT * FROM OPENQUERY(MYSQL,'SELECT id,name FROM test.user');
insert into openquery(MYSQL,'select id,name from test.user where 1=0') values (5,'newUser');
5,建立MSSQL連結的伺服器
exec sp_addlinkedserver
'MSSQL', '', 'SQLOLEDB', 'tcp:ip\hostname,1433'
go
exec
sp_addlinkedsrvlogin 'MSSQL', 'false',null, 'username', 'password'
go
select * from openquery(MSSQL,'select id,name from test.dbo.[user]')
go==================2、資料庫的訪問以及操作
連結資料庫建立後,就可以對連結資料庫進行訪問,普通方法有2種:
(1)T-SQL方式 select * from [連結資料表名稱].[資料庫名].[架構].[表名]
ACCESS一般使用: select * from [連結資料表名稱]...[表名] (資料庫名和架構都沒)
MSSQL 一般使用: select * from [連結資料表名稱].[資料庫名].[dbo].[表名]
Oracle 一般使用: 據說是 select * from [連結資料表名稱]..[Oracle使用者名稱].[表名] (我沒試成功過。。)
(2)PL/SQL方式 使用OpenQuery互動(雖然不是最好的,但速度比第一種方法至少快一半)
查詢執行個體:
Select * from OpenQuery(串連伺服器名稱,'Select * from [表名]')
新增執行個體:
INSERT OPENQUERY (連結服務名稱, 'SELECT 欄位1,欄位2 FROM 表') VALUES ('值1', '值2');
順便提下:OPENQUERY 會返回一個資料集,換言之上面的語句,必須要等表所有資料都select後才會插入資料,如果資料量大這個過程非常漫長,所以上面的語句需要改進下:
INSERT OPENQUERY (連結服務名稱, 'SELECT 欄位1,欄位2 FROM 表 where 1=2') VALUES ('值1', '值2');
更新執行個體:
UPDATE OPENQUERY (連結服務名稱, 'SELECT 欄位1,欄位2 FROM 表 WHERE id=1') SET 欄位1= '值1', 欄位2= '值2';
刪除執行個體:
DELETE OPENQUERY (連結服務名稱, 'SELECT 欄位1 FROM 表 WHERE 欄位1=1');
(以上所有操作執行個體如果連結的伺服器是MSSQL,則需要在表名前添加資料庫和架構,如:資料庫名.dbo.表名)
另外關於引號的小問題也提下,雖然簡單但有時候也容易忽略,比如:
Select * from OpenQuery(串連伺服器名稱,'Select * from [表名] where id=1') 這樣沒問題,但如果id是字元那麼應該是
Select * from OpenQuery(串連伺服器名稱,'Select * from [表名] where id=''值''') 需要在一前一後加2個 ' ,如果中間的語句再複雜些,或者引入函數等,需要拆開寫,那前後就需要加4個' ,反正原則就是引一次加2個',其實也就是轉義。
3、同義字的的使用(僅SQL2005及以上版本支援!)
這個東東很好!很強大! (OPENQUERY其實也就是它的簡化版)
建立語句:
CREATE SYNONYM [同義字名稱] FOR [連結的伺服器名稱].[資料庫].[架構].[表名]
GO
我的個人理解是,首先通過連結的伺服器建立遠程連結,再通過連結的伺服器建立同義字到本機資料庫,這樣一來在本機資料庫上就相當於建立了虛擬表(支援4種對象的建立:表、視圖、函數、預存程序),遠端表就像在本地一樣,所以同義字翻譯成連結資料表或者連結化物件似乎更為恰當。。
這樣一來,操作遠端資料庫就非常方便了,不管是ACCESS、SQL、還是Oracle(估計其他資料庫連結過來也是一樣的道理,前提是需要有相應的提供者)都可以使用最普通的T-SQL語句操作,如:
select * from 同義字名稱
insert into 同義字名稱(...) values(...)
delete 同義字名稱 where...
(當然需要執行增加、刪除、修改等操作,需要你相對應的連結的伺服器有相應的許可權)
這樣一來前面提到的2種訪問連結資料庫的方式通通都可以放棄,不過可惜的是如果是SQL2000的話,仍然只能使用OpenQuery來互動資料庫。。。
轉自:http://www.cnblogs.com/seerlin/archive/2011/06/01/2065638.html