前言:正好这两天在同步生产环境的某张表数据到测试环境,之前用过一些同步数据软件,感觉不太可靠,有时候稍有操作不当,就会出现生产环境数据被清空等情况,还要去恢复数据。如果能恢复还好,不能恢复那么......想想就觉得阔怕,后来想起 SQLSERVER 有 OPENROWSET 函数可以通过 T-SQL 访问远程数据库,正好可以使用,看得见的SQL 比 同步数据软件看起来安心多了,哈哈.... 不讲废话了
一、OPENROWSET
简介:包含访问 OLE DB 数据源中的远程数据所需的所有连接信息。 当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的临时方法。 对于较频繁引用 OLE DB 数据源的情况,请改为使用链接服务器。 OPENROWSET
函数可以在查询的 FROM 子句中引用,就好象它是一个表名。 依据 OLE DB 提供程序的功能,还可以将 OPENROWSET
函数引用为 INSERT
、UPDATE
或 DELETE
语句的目标表。 尽管查询可能返回多个结果集,但 OPENROWSET
只返回第一个结果集。
1. 语法详解
OPENROWSET ( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' } , { [ catalog. ] [ schema. ] object | 'query' } } )
provider_name:字符串,表示在注册表中指定的 OLE DB 访问接口的友好名称)。 provider_name 没有默认值
datasource:对应于特定 OLE DB 数据源的字符串常量。 datasource 是要传递给提供程序的 IDBProperties 接口的 DBPROP_INIT_DATASOURCE 属性,该属性用于初始化提供
程序 。 通常,此字符串包含数据库文件的名称、数据库服务器的名称,或者访问接口能理解的用于定位数据库的名称。
user_id:字符串常量,它是传递给指定 OLE DB 访问接口的用户名。 user_id 为连接指定安全上下文,并作为 DBPROP_AUTH_USERID 属性传入以初始化提供程序 。
password:字符串常量,它是传递给 OLE DB 访问接口的用户密码。 在初始化提供程序时,password 作为 DBPROP_AUTH_PASSWORD 属性传入 。
provider_string:访问接口特定的连接字符串,作为 DBPROP_INIT_PROVIDERSTRING 属性传入以初始化 OLE DB 访问接口。 provider_string 通常封装初始化提供程序所需的
所有连接信息 。
catalog:指定对象所在的目录或数据库的名称。
schema:架构的名称或指定对象的对象所有者名称。
object:架构的名称或指定对象的对象所有者名称。
query:字符串常量,发送到访问接口并由访问接口执行。 SQL Server 的本地实例不处理该查询,但处理由访问接口返回的查询结果(传递查询)。 有些访问接口并不通过表名而
是通过命令语言提供其表格格式数据,将传递查询用于这些访问接口是非常有用的。 只要查询提供程序支持 OLE DB Command 对象及其强制接口,那么在远程服务器上
就支持传递查询。
注:如果 OLE DB 提供程序在指定的数据源中支持多个目录和架构,那么就需要目录及架构名称。如果 OLE DB 提供程序并不支持目录和架构,那么可以省略 catalog 及 schema 的
值。 如果提供程序只支持架构名,那么必须指定一个两部分名称,形式为 schema.object。如果提供程序只支持目录名,那么必须指定一个三部分名称
,形式为 catalog.schema.object。
OPENROWSET 不接受参数变量。
权限:OPENROWSET 权限由传递到 OLE DB 提供程序的用户名的权限确定。
2. 示例
SELECT * FROM OPENROWSET('SQLNCLI',
'server=IP地址;uid=账号;pwd=密码;database=数据库名称',
'SELECT * FROM _category');
3. 错误描述
OLE DB 错误:OLE DB 或 ODBC 错误
发生这种问题是因为 SQL SERVER 只提供一组特定访问接口的进程内访问。SQLNCLI.1 是 SQL SERVER 的一个新的本机 OLE DB 访问接口,它具有访问权。但是 SQLNCLI.1 是特定于版本的 SQLNCLI 访问接口,他不在访问接口的列表中,因此 SQLNCI.1 没有访问权,尽管 SQLNCLI 和 SQLNCLI.1 完全相同(因为 SQLNCLI 指向 SQLNCI.1),但 SQL SERVER 并不能识别出它们是相同的,SQL SERVER 会阻止对 SQLNCI.1 的访问
要解决此问题,请使用下列方法之一:
- 在 OLE DB 连接字符串中使用 SQLNCLI 和 SQLOLEDB 代替 SQLNCLI.1
- 在 SQL SERVER 中,将 SQLNCLI.1 显示添加到具有进程内访问权的供应商列表中