1.openrowset/opendatasource使用html
在使用openrowset/opendatasource前搜先要啓用Ad Hoc Distributed Queries服務,由於這個服務不安全因此SqlServer默認是關閉的sql
啓用Ad Hoc Distributed Queries的方法安全
SQL Server 阻止了對組件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource'服務器
的訪問,由於此組件已做爲此服務器安全配置的一部分而被關閉。系統管理員能夠經過使用ide
sp_configure 啓用 'Ad Hoc Distributed Queries'。有關啓用 'Ad Hoc Distributed Queries' 的詳細spa
信息,請參閱 SQL Server 聯機叢書中的 "外圍應用配置器"。code
啓用Ad Hoc Distributed Queries的方法,執行下面的查詢語句就能夠了:server
exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure
使用完畢後,記得必定要要關閉它,由於這是一個安全隱患,切記執行下面的SQL語句htm
exec sp_configure 'Ad Hoc Distributed Queries',0 reconfigure exec sp_configure 'show advanced options',0 reconfigure
二、openrowset/opendatasource使用示例blog
--鏈接遠程/局域網數據(openrowset/opendatasource) --一、openrowset --openrowset使用OLEDB的一些例子 select * from openrowset('SQLOLEDB','Server=(local);PWD=***;UID=sa;','select * from TB.dbo.school') as t select * from openrowset('SQLOLEDB','Server=(local);PWD=***;UID=sa;',TB.dbo.school) as t select * from openrowset('SQLOLEDB','Server=(local);Trusted_Connection=yes;',TB.dbo.school) as t select * from openrowset('SQLOLEDB','(local)';'sa';'***','select * from TB.dbo.school') as t select * from openrowset('SQLOLEDB','(local)';'sa';'***',TB.dbo.school) as t select * from openrowset('SQLOLEDB','(local)';'sa';'***','select school.id as id1,people.id as id2 from TB.dbo.school inner join TB.dbo.people on school.id=people.id') as t --openrowset使用SQLNCLI的一些例子(SQLNCLI在SqlServer2005以上才能使用) select * from openrowset('SQLNCLI','(local)';'sa';'***','select * from TB.dbo.school') as t select * from openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select * from TB.dbo.school') as t select * from openrowset('SQLNCLI','Server=(local);UID=sa;PWD=***;','select * from TB.dbo.school') as t select * from openrowset('SQLNCLI','Server=(local);UID=sa;PWD=***;',TB.dbo.school) as t select * from openrowset('SQLNCLI','Server=(local);UID=sa;PWD=***;DataBase=TB','select * from dbo.school') as t --openrowset其餘使用 insert openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select name from TB.dbo.school where id=1') values('ghjkl')/*要不要where都同樣,插入一行*/ update openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select name from TB.dbo.school where id=1') set name='kkkkkk' delete from openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select name from TB.dbo.school where id=1') --二、opendatasource --opendatasource使用SQLNCLI的一些例子 select * from opendatasource('SQLNCLI','Server=(local);UID=sa;PWD=***;').TB.dbo.school as t select * from opendatasource('SQLNCLI','Server=(local);UID=sa;PWD=***;DataBase=TB').TB.dbo.school as t --opendatasource使用OLEDB的例子 select * from opendatasource('SQLOLEDB','Server=(local);Trusted_Connection=yes;').TB.dbo.school as t --opendatasource其餘使用 insert opendatasource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school(name) values('ghjkl')/*要不要where都同樣,插入一行*/ update opendatasource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school set name='kkkkkk' delete from opendatasource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school where id=1
三、openquery使用
先執行EXEC sp_addlinkedserver建立遠程服務器的連接,再執行Exec sp_droplinkedsrvlogin登陸連接上的遠程服務器,以後就能夠執行各類sql操做了。
--EXEC sp_addlinkedserver --@server='ZYB',--被訪問的服務器別名 --@srvproduct='', --@provider='SQLOLEDB', --@datasrc="/Server2" --要訪問的服務器 --EXEC sp_addlinkedsrvlogin --'ZYB', --被訪問的服務器別名 --'false', --NULL, --'sa', --賬號 --'sa' --密碼 --Exec sp_droplinkedsrvlogin ZYB,Null --刪除映射(錄與連接服務器上遠程登陸之間的映射) --Exec sp_dropserver ZYB --刪除遠程服務器連接
四、openquery使用示例
--openquery使用OLEDB的一些例子 exec sp_addlinkedserver 'ITSV', '', 'SQLOLEDB','(local)' exec sp_addlinkedsrvlogin 'ITSV', 'false',null, 'sa', '***' select * FROM openquery(ITSV, 'SELECT * FROM TB.dbo.school ') exec sp_droplinkedsrvlogin ITSV,Null exec sp_dropserver ITSV --openquery使用SQLNCLI的一些例子 exec sp_addlinkedserver 'ITSVA', '', 'SQLNCLI','(local)' exec sp_addlinkedsrvlogin 'ITSVA', 'false',null, 'sa', '***' select * FROM openquery(ITSVA, 'SELECT * FROM TB.dbo.school ') exec sp_droplinkedsrvlogin ITSVA,Null exec sp_dropserver ITSVA
另一種方法,是直接使用建立的連接別名:
exec sp_addlinkedserver 'ITSV', '', 'SQLOLEDB','(local)' exec sp_addlinkedsrvlogin 'ITSV', 'false',null, 'sa', '***' select * FROM ITSV.TB.dbo.school exec sp_droplinkedsrvlogin ITSV,Null exec sp_dropserver ITSV
五、總結
能夠看到SqlServer鏈接多服務器的方式有3種
其中我我的認爲openrowset最好,使用簡單並且支持在鏈接時制定查詢語句使用很靈活
openquery也不錯查詢時也能夠指定查詢語句使用也很靈活,不過查詢前要先用exec sp_addlinkedserver和exec sp_addlinkedsrvlogin創建服務器和服務器鏈接稍顯麻煩
opendatasource稍顯欠佳,他沒法在鏈接時指定查詢使用起來稍顯笨拙
另外還能夠鏈接到遠程Analysis服務器作MDX查詢,再用T-Sql作嵌套查詢,可見T-SQL的遠程查詢很是強大
轉自:http://www.cnblogs.com/OpenCoder/archive/2010/03/18/1689321.html