分布式查詢
??? OPENROWSET
??? 從Excel取數據
??? SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=d:\1.xls',[Sheet1$])
??? 從Oracle取數據
??? SELECT?* FROM OPENROWSET('MSDAORA.1','NetServiceName';'User';'Password','SELECT * FROM OracleTalbe')
?
??? Linked Server(for Oracle)
??? 建立Linked Server
??? sp_addlinkedserver'Allies', 'Oracle', 'MSDAORA.1', 'NetServiceName'
??? Oracle的Login
??? sp_addlinkedsrvlogin'Allies', FALSE, 'SQLServerLogin', 'OracleUser', 'OraclePassword'
??? 從Oracle查詢數據
??? SELECT*FROM OPENQUERY( Allies, 'SELECT * FROM OracleTalbe'),或者
??? SELECT*FROM
Allies..OracleUser.OracleTalbe
??? 修改Linked Server的Server Option
?
?? sp_serveroption'Allies', 'Option Name',
'Option Value'
??? 例如
??? sp_serveroption'OraDC', 'rpc out', 'true'
??? sp_serveroption'OraDC', 'rpc', 'true'
??? 向Oracle插入數據(還沒有用過)
??? INSERT INTO OPENQUERY(Allies, 'SELECT ... FROM OracleTalbe WHERE 1=2') VALUES ( ... )
??? 刪除Linked Server
??? sp_dropserver'Allies', 'droplogins'
?
??? 注意:使用OPENROWSET、OPENQUERY時,SQL Server不對提交的SQL語句做任何檢查,直接將語句提交給Linked Server進行處理;使用四部分命名法時,SQL Server可能從Linked Server上讀取被引用表的數據到SQL Server,然后在SQL Server上來完成其它操作。
?
??? 設置SQL Server到Oracle的Linked Server,可參考以下KB文章:
?
??? 分布式事務中的OPENROWSET、OPENQUERY、OPENDATASOURCE
??? 如果在事務,或是一些隱含使用事務的情況下,例如TRIGGER中,使用OPENROWSET、OPENQUERY、OPENDATASOURCE時,就需要使用分布式事務來處理。
??? 在分布式事務中使用OPENROWSET、OPENQUERY、OPENDATASOURCE或Linked Server時,需要注意:
??? 1. 必須啟動MSDTC服務。
????Service Name為Distributed Transaction Coodinator。
??? 2. 所涉及的Server之間如果存在網關、防火墻,需要開啟TCP 135端口。
??? 分布式事務需要使用這個端口通訊。
??? 3. 如果Server之間跨網段,則Server之間需要能互相PING到機器名(而不是IP地址)。
??? 如果相互PING機器名有問題,修改system32/driver/etc目錄下的hosts文件。
?
??? 上面的設置不正確時,會出現類似如下的錯誤:
??? 該操作未能執行,因為 OLE DB 提供程序 'SQLOLEDB' 無法啟動分布式事務。
[OLE/DB provider returned message: 新事務不能登記到指定的事務處理器中。 ]
OLE DB 錯誤跟蹤[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
?
?
??? 分布式事務可以查詢下列KB文章:
?