前言:正好这两天在同步生产环境的某张表数据到测试环境,之前用过一些同步数据软件,感觉不太可靠,有时候稍有操作不当,就会出现生产环境数据被清空等情况,还要去恢复数据。如果能恢复还好,不能恢复那么......想想就觉得阔怕,后来想起 SQLSERVEROPENROWSET 函数可以通过 T-SQL 访问远程数据库,正好可以使用,看得见的SQL 比 同步数据软件看起来安心多了,哈哈.... 不讲废话了

 

一、OPENROWSET

  简介:包含访问 OLE DB 数据源中的远程数据所需的所有连接信息。 当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的临时方法。 对于较频繁引用 OLE DB 数据源的情况,请改为使用链接服务器。 OPENROWSET 函数可以在查询的 FROM 子句中引用,就好象它是一个表名。 依据 OLE DB 提供程序的功能,还可以将 OPENROWSET 函数引用为 INSERTUPDATE 或 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 DBODBC 错误

  发生这种问题是因为 SQL SERVER 只提供一组特定访问接口的进程内访问。SQLNCLI.1 是 SQL SERVER 的一个新的本机 OLE DB 访问接口,它具有访问权。但是 SQLNCLI.1 是特定于版本的 SQLNCLI 访问接口,他不在访问接口的列表中,因此 SQLNCI.1 没有访问权,尽管 SQLNCLISQLNCLI.1 完全相同(因为 SQLNCLI 指向 SQLNCI.1),但 SQL SERVER 并不能识别出它们是相同的,SQL SERVER 会阻止对 SQLNCI.1 的访问

 

  要解决此问题,请使用下列方法之一:

  • 在 OLE DB 连接字符串中使用 SQLNCLI 和 SQLOLEDB  代替 SQLNCLI.1
  • SQL SERVER 中,将  SQLNCLI.1 显示添加到具有进程内访问权的供应商列表中

 

  

 

posted on 2019-08-05 16:54  JamelAr  阅读(8908)  评论(0编辑  收藏  举报