分布式查詢
??? OPENROWSET
??? 從Excel取數(shù)據(jù)
??? SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=d:\1.xls',[Sheet1$])
??? 從Oracle取數(shù)據(jù)
??? 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查詢數(shù)據(jù)
??? 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插入數(shù)據(jù)(還沒有用過(guò))
??? INSERT INTO OPENQUERY(Allies, 'SELECT ... FROM OracleTalbe WHERE 1=2') VALUES ( ... )
??? 刪除Linked Server
??? sp_dropserver'Allies', 'droplogins'
?
??? 注意:使用OPENROWSET、OPENQUERY時(shí),SQL Server不對(duì)提交的SQL語(yǔ)句做任何檢查,直接將語(yǔ)句提交給Linked Server進(jìn)行處理;使用四部分命名法時(shí),SQL Server可能從Linked Server上讀取被引用表的數(shù)據(jù)到SQL Server,然后在SQL Server上來(lái)完成其它操作。
?
??? 設(shè)置SQL Server到Oracle的Linked Server,可參考以下KB文章:
?
??? 分布式事務(wù)中的OPENROWSET、OPENQUERY、OPENDATASOURCE
??? 如果在事務(wù),或是一些隱含使用事務(wù)的情況下,例如TRIGGER中,使用OPENROWSET、OPENQUERY、OPENDATASOURCE時(shí),就需要使用分布式事務(wù)來(lái)處理。
??? 在分布式事務(wù)中使用OPENROWSET、OPENQUERY、OPENDATASOURCE或Linked Server時(shí),需要注意:
??? 1. 必須啟動(dòng)MSDTC服務(wù)。
????Service Name為Distributed Transaction Coodinator。
??? 2. 所涉及的Server之間如果存在網(wǎng)關(guān)、防火墻,需要開啟TCP 135端口。
??? 分布式事務(wù)需要使用這個(gè)端口通訊。
??? 3. 如果Server之間跨網(wǎng)段,則Server之間需要能互相PING到機(jī)器名(而不是IP地址)。
??? 如果相互PING機(jī)器名有問(wèn)題,修改system32/driver/etc目錄下的hosts文件。
?
??? 上面的設(shè)置不正確時(shí),會(huì)出現(xiàn)類似如下的錯(cuò)誤:
??? 該操作未能執(zhí)行,因?yàn)?OLE DB 提供程序 'SQLOLEDB' 無(wú)法啟動(dòng)分布式事務(wù)。
[OLE/DB provider returned message: 新事務(wù)不能登記到指定的事務(wù)處理器中。 ]
OLE DB 錯(cuò)誤跟蹤[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
?
?
??? 分布式事務(wù)可以查詢下列KB文章:
?