MSSQL鏈接常用數據庫(二)

原文地址  
1、建立鏈接服務器。

簡單說明下sp_addlinkedserver 這個存儲過程的幾個重要參數
@server = N'鏈接服務器名稱', @srvproduct=N'產品名稱', @provider=N'訪問接口', @datasrc=N'數據源' 於是:
ACCESS的建立
(1)沒有密碼的情況:
EXECUTE sp_addlinkedserver 'OLE_TEST', 'Access', 'Microsoft.Jet.OLEDB.4.0', 'E:\MyDatabase.mdb(詳細路徑)'
GO
(2)有密碼的情況
EXECUTE sp_addlinkedserver 'OLE_TEST', 'Access', 'Microsoft.Jet.OLEDB.4.0', 'E:\MyDatabase.mdb(詳細路徑)',null,';pwd=密碼'
GO
如果啓用了賬戶權限,那就沒這麼簡單了,註冊表SystemDB項也需要修改,不過這種情況應該很少。
MSSQL的建立
EXECUTE sp_addlinkedserver 'SQL_TEST','SQL','SQLOLEDB','機器名稱/IP地址/域名等'
EXECUTE sp_addlinkedsrvlogin 'SQL_TEST',FALSE,null,'用戶名','密碼'
GO
ORACLE的建立
EXECUTE sp_addlinkedserver 'ORA_TEST','Oracle','MSDAORA','Oracle數據源名稱'
EXECUTE sp_addlinkedsrvlogin 'ORA_TEST',FALSE,null,'用戶名','密碼'
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來交互數據庫。。。
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章