zoukankan      html  css  js  c++  java
  • SQLSERVER调用OPENROWSET的方法

    前言:正好这两天在同步生产环境的某张表数据到测试环境,之前用过一些同步数据软件,感觉不太可靠,有时候稍有操作不当,就会出现生产环境数据被清空等情况,还要去恢复数据。如果能恢复还好,不能恢复那么......想想就觉得阔怕,后来想起 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 显示添加到具有进程内访问权的供应商列表中

      

  • 相关阅读:
    第二十九课 循环链表的实现
    第二十八课 再论智能指针(下)
    第二十七课 再论智能指针(上)
    第二十六课 典型问题分析(Bugfix)
    普通new和placement new的重载
    leetcode 581. Shortest Unsorted Continuous Subarray
    leetcode 605. Can Place Flowers
    leetcode 219. Contains Duplicate II
    leetcode 283. Move Zeroes
    leetcode 217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/JamelAr/p/11303882.html
Copyright © 2011-2022 走看看