1.openrowset/opendatasource使用
在使用openrowset/opendatasource前搜先要啟用Ad Hoc Distributed Queries服務,因為這個服務不安全所以SqlServer默認是關閉的
啟用Ad Hoc Distributed Queries的方法
SQL Server 阻止了對組件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource'
的訪問,因為此組件已作為此服務器安全配置的一部分而被關閉。系統管理員可以通過使用
sp_configure 啟用 'Ad Hoc Distributed Queries'。有關啟用 'Ad Hoc Distributed Queries' 的詳細
信息,請參閱 SQL Server 聯機叢書中的 "外圍應用配置器"。
啟用Ad Hoc Distributed Queries的方法,執行下面的查詢語句就可以了:
exec sp_configure 'show advanced options',1reconfigureexec sp_configure 'Ad Hoc Distributed Queries',1reconfigure
使用完畢后,記得一定要要關閉它,因為這是一個安全隱患,切記執行下面的SQL語句
exec sp_configure 'Ad Hoc Distributed Queries',0reconfigureexec sp_configure 'show advanced options',0reconfigure
2、openrowset/opendatasource使用示例
--連接遠程/局域網數據(openrowset/opendatasource) --1、openrowset --openrowset使用OLEDB的一些例子select * from openrowset('SQLOLEDB','Server=(local);PWD=***;UID=sa;','select * from TB.dbo.school') as tselect * from openrowset('SQLOLEDB','Server=(local);PWD=***;UID=sa;',TB.dbo.school) as tselect * from openrowset('SQLOLEDB','Server=(local);Trusted_Connection=yes;',TB.dbo.school) as tselect * from openrowset('SQLOLEDB','(local)';'sa';'***','select * from TB.dbo.school') as tselect * from openrowset('SQLOLEDB','(local)';'sa';'***',TB.dbo.school) as tselect * 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 tselect * from openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select * from TB.dbo.school') as tselect * from openrowset('SQLNCLI','Server=(local);UID=sa;PWD=***;','select * from TB.dbo.school') as tselect * from openrowset('SQLNCLI','Server=(local);UID=sa;PWD=***;',TB.dbo.school) as tselect * 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')--2、opendatasource--opendatasource使用SQLNCLI的一些例子select * from opendatasource('SQLNCLI','Server=(local);UID=sa;PWD=***;').TB.dbo.school as tselect * 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
3、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 --刪除遠程服務器鏈接
4、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,Nullexec 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,Nullexec sp_dropserver ITSVA
另外一種方法,是直接使用創建的鏈接別名:
exec sp_addlinkedserver 'ITSV', '', 'SQLOLEDB','(local)' exec sp_addlinkedsrvlogin 'ITSV', 'false',null, 'sa', '***'select * FROM ITSV.TB.dbo.schoolexec sp_droplinkedsrvlogin ITSV,Nullexec sp_dropserver ITSV
5、總結
可以看到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
新聞熱點
疑難解答