在T-SQL語句中訪問遠程數據庫(openrowset/opendatasource/openquery)

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

相關文章
相關標籤/搜索