SQL远程连接
第一种方式:使用 OPENDATASOURCE 进行连接:
语法:
OPENDATASOURCE ( provider_name, init_string )
参数:
provider_name
注册为用于访问数据源的 OLE DB 访问接口的 PROGID 的名称。provider_name 的数据类型为 char,无默认值。
init_string
连接字符串,该字符串将要传递给目标提供程序的 IDataInitialize 接口。提供程序字符串语法是以关键字值对为基础的,这些关键字值对由分号隔开,例如:"keyword1=value; keyword2=value"。
注意:
- 仅当 DisallowAdhocAccess 注册表选项针对指定的提供程序显式设置为 0,并且启用 Ad Hoc Distributed Queries 高级配置选项时,OPENDATASOURCE 才可用于访问 OLE DB 数据源中的远程数据。如果未设置这些选项,则默认行为不允许即席访问。
配制 Ad Hoc Distributed Queries 的方法:
SP_CONFIGURE 'show advanced options',1
GO
RECONFIGURE
GO
-- 为开启为关闭
SP_CONFIGURE 'Ad Hoc Distributed Queries',1
GO
RECONFIGURE
GO
SP_CONFIGURE 'show advanced options',0
GO
RECONFIGURE
- OPENDATASOURCE 函数可以在能够使用链接服务器名的相同 Transact-SQL 语法位置中使用。因此,可以将 OPENDATASOURCE 用作四部分名称的第一部分,该部分名称引用 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称;或者引用 EXECUTE 语句中的远程存储过程。当执行远程存储过程时,OPENDATASOURCE 应该引用 SQL Server 的另一个实例。OPENDATASOURCE 不接受参数变量。
- 与 OPENROWSET 函数类似,OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。对于访问次数较频繁的任何数据源,请为它们定义链接服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接服务器定义的全部功能,例如,安全管理以及查询目录信息的功能。每次调用 OPENDATASOURCE 时,都必须提供所有的连接信息(包括密码)。
- Windows 身份验证比 SQL Server 身份验证更加安全。应尽量使用 Windows 身份验证。OPENDATASOURCE 不应该用于连接字符串中的显式密码。
- 任何用户都可以执行 OPENDATASOURCE。用于连接到远程服务器的权限由连接字符串确定。
例:
SELECT *
FROM OPENDATASOURCE
(
'SQLOLEDB',
'Data Source=192.168.1.43;User ID=sa;Password=sa'
).databasename.dbo.tablename
如果是Windows身份认证登陆,则可以使用Integrated Security=SSPI安全验证登陆。
第二种方法:使用 SP_ADDLINKEDSERVER 进行连接:
语法:
sp_addlinkedserver
@server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
参数:
- [ @server = ] 'server'
要创建的链接服务器的名称。server 的数据类型为 sysname,没有默认值。
- [ @srvproduct = ] 'product_name'
要添加为链接服务器的 OLE DB 数据源的产品名称。product_name 的数据类型为 nvarchar(128),默认值为 NULL。如果为 SQL Server,则不必指定 provider_name、data_source、location、provider_string 和 catalog。
- [ @provider = ] 'provider_name'
与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。对于当前计算机中安装的指定 OLE DB 访问接口,provider_name 必须唯一。provider_name 的数据类型为 nvarchar(128),默认值为 NULL;但如果忽略 provider_name,则使用 SQLNCLI。SQLNCLI 是 SQL 本机 OLE DB 访问接口。OLE DB 访问接口应以指定的 PROGID 在注册表中注册。
- [ @datasrc = ] 'data_source'
由 OLE DB 访问接口解释的数据源的名称。data_source 的数据类型为 nvarchar(4000)。data_source 作为 DBPROP_INIT_DATASOURCE 属性传递以初始化 OLE DB 访问接口。
- [ @location = ] 'location'
由 OLE DB 访问接口解释的数据库的位置。location 的数据类型为 nvarchar(4000),默认值为 NULL。location 作为 DBPROP_INIT_LOCATION 属性传递以初始化 OLE DB 访问接口。
- [ @provstr = ] 'provider_string'
OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。provider_string 的数据类型为 nvarchar(4000),默认值为 NULL。provstr 或传递给 IDataInitialize 或设置为 DBPROP_INIT_PROVIDERSTRING 属性以初始化 OLE DB 访问接口。
在针对 SQL 本机客户端 OLE DB 访问接口创建链接服务器后,可将 SERVER 关键字用作 SERVER=servername\instancename 来指定实例,以指定特定的 SQL Server 实例。servername 是运行 SQL Server 的计算机名称,instancename 是用户将连接到的特定 SQL Server 实例的名称。
- [ @catalog = ] 'catalog'
与 OLE DB 访问接口建立连接时所使用的目录。catalog 的数据类型为 sysname,默认值为 NULL。catalog 作为 DBPROP_INIT_CATALOG 属性传递以初始化 OLE DB 访问接口。在针对 SQL Server 实例定义链接服务器时,目录指向链接服务器映射到的默认数据库。
远程 OLE DB 数据源 | OLE DB 访问接口 | product_name | provider_name | data_source | location | provider_string | 目录 |
SQL Server | Microsoft SQL 本机客户端 OLE DB 访问接口 | SQL Server 1(默认值) |
|
|
|
|
|
SQL Server | Microsoft SQL 本机客户端 OLE DB 访问接口 |
| SQLNCLI | SQL Server 的网络名称(用于默认实例) |
|
| 数据库名称(可选) |
SQL Server | Microsoft SQL 本机客户端 OLE DB 访问接口 |
| SQLNCLI | servername\instancename(用于特定实例) |
|
| 数据库名称(可选) |
Oracle | Microsoft OLE DB Provider for Oracle | 任何2 | MSDAORA | 用于 Oracle 数据库的 SQL*Net 别名 |
|
|
|
Oracle,版本 8 及更高版本 | Oracle Provider for OLE DB | 任何 | OraOLEDB.Oracle | 用于 Oracle 数据库的别名 |
|
|
|
Access/Jet | Microsoft OLE DB Provider for Jet | 任何 | Microsoft.Jet.OLEDB.4.0 | Jet 数据库文件的完整路径 |
|
|
|
ODBC 数据源 (ODBC data source) | Microsoft OLE DB Provider for ODBC | 任何 | MSDASQL | ODBC 数据源的系统 DSN |
|
|
|
ODBC 数据源 (ODBC data source) | Microsoft OLE DB Provider for ODBC | 任何 | MSDASQL |
|
| ODBC 连接字符串 |
|
文件系统 | Microsoft OLE DB Provider for Indexing Service | 任何 | MSIDXS | 索引服务目录名称 |
|
|
|
Microsoft Excel 电子表格 | Microsoft OLE DB Provider for Jet | 任何 | Microsoft.Jet.OLEDB.4.0 | Excel 文件的完整路径 |
| Excel 5.0 |
|
IBM DB2 数据库 | Microsoft OLE DB Provider for DB2 | 任何 | DB2OLEDB |
|
| 请参阅 Microsoft OLE DB Provider for DB2 文档。 | DB2 数据库的目录名称 |
同样在进行连接时需要开启 Ad Hoc Distributed Queries。
@provstr = 'DRIVER={SQL Server};SERVER=192.168.1.43;UID=sa;PWD=sa;',