SQL Server访问远程数据库和Linked Server
SQL Server连接远程数据源的基本方法有下面三种:
OPENDATASOURCE: The OPENDATASOURCE function is used to specify connection information for a remote data source by specifying the OLE DB provider and an initialization string. OPENDATASOURCE can be used directly within a SELECT, INSERT, UPDATE, or DELETE statement.
OPENROWSET: The OPENROWSET function is used to specify connection information for a remote data source and the name of an object that will return a result set (such as a stored procedure) or a query that will return a result set. Like OPENDATASOURCE, OPENROWSET can be used directly within a SELECT, INSERT, UPDATE, or DELETE statement.
Linked servers: A linked server is an object within SQL Server that defines the connection properties of another SQL Server. When defined, queries can connect to the remote server using a four-part name, such as
SQLSrv1.AdventureWorks.person.Contact
The four-part name identifies the server (SQLSrv1), the database (AdventureWorks), the schema (Person), and the object (Contact table). Linked servers are explored in more depth in the final section of this chapter.
其中OPENDATASOURCE和OPENROWSET方法一般用来做临时查询(ad hoc query),如果需要经常的查询远程数据,则建议创建linked servers。但是,默认情况ad hoc query 是禁用的,需要手动启动:
sp_configure ‘show advanced options’, 1;
GO
RECONFIGURE;
GO
sp_configure ‘Ad hoc Distributed Queries’, 1;
GO
RECONFIGURE;
然后,就可以使用OPENDATASOURCE 查询远程数据库了,OPENDATASOURCE 基本语法如下:OPENDATASOURCE ( provider_name, init_string )。示例代码如下:
SELECT *
FROM OPENDATASOURCE(‘SQLNCLI’,
‘Data Source=SQL08;Integrated Security=SSPI’)
.Sales.dbo.Customers
上述代码从SQL08服务器上读取Sales数据库的Customers表的内容。
也可以通过OPENROWSET方法查询远程数据库,OPENROWSET和OPENDATASOURCE方法相似,基本的差异是OPENROWSET总是返回结果集,而OPENDATASOURCE方法除了可以返回结果集(Result Set)外,也可以用来执行存储过程。
OPENROWSET 基本语法如下:
OPENROWSET ( provider_name, provider_string )
示例代码:
SELECT rs.*
FROM OPENROWSET(‘SQLNCLI’,
‘Server=SQL08;Trusted_Connection=yes;’,
‘SELECT * FROM Sales.dbo.Customers’) AS rs;
使用Linked Server
如果你计划多次查询外部或远程数据源,建议创建linked server。尽管创建linked server需要一点时间,但是一旦创建后,你可以非常方便地使用four-part 名称来访问远程数据源。
![](http://blog.entlib.com/userfiles/EntLib/image/SQLServer/linkedserver_1.gif)
创建和配置linked server一般需要两步:
第一步是创建linked server。
可以通过sp_addlinkserver系统存储过程来创建linked server,基本语法如下:
sp_addlinkedserver [ @server= ] ‘server’ [ , [@srvproduct= ] ‘product_name’ ]
[ , [ @provider= ] ‘provider_name’ ]
[ , [ @datasrc= ] ‘data_source’ ]
[ , [ @location= ] ‘location’ ]
[ , [ @provstr= ] ‘provider_string’ ]
[ , [ @catalog= ] ‘catalog’ ]
示例脚本如下所示:
EXEC sp_addlinkedserver @server = 'SQLSRV3', @srvProduct = N'SQL Server'
也可以通过SQL Server的管理界面,来创建linked server,如下图所示:
![](http://blog.entlib.com/userfiles/EntLib/image/SQLServer/linkedserver_2.gif)
右键点击上述节点,选择“新建链接服务器…”,在弹出的窗口,就可以创建linked server了。
第二步是创建linked server的登录帐号。
在linked server创建后,下一步是创建远程服务器的登录帐号。通过本地SQL Server的登录帐号来映射到linked server的登录帐号。
![](http://blog.entlib.com/userfiles/EntLib/image/SQLServer/linkedserver_3.gif)
创建linked server的登录帐号也有两种方法,一种是通过系统存储过程 sp_addlinkedsrvlogin,sp_addlinkedsrvlogin的基本语法如下:
sp_addlinkedsrvlogin [ @rmtsrvname = ] ‘rmtsrvname’
[ , [ @useself = ] ‘TRUE’ | ‘FALSE’ | ‘NULL’]
[ , [ @locallogin = ] ‘locallogin’ ]
[ , [ @rmtuser = ] ‘rmtuser’ ]
[ , [ @rmtpassword = ] ‘rmtpassword’ ]
sp_addlinkedsrvlogin创建远程服务器登录帐号示例脚本如下:
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'SQLSRV3', @useself=N'False', @locallogin=N'sa', @rmtuser=N'remoteuser', @rmtpassword='passowrd'
当然也可以通过SQL Server管理界面来设置登录帐号,如下图所示:
![](http://blog.entlib.com/userfiles/EntLib/image/SQLServer/linkedserver_4.gif)