zoukankan      html  css  js  c++  java
  • 启用 'Ad Hoc Distributed Queries'

    SQL Server 阻止了对组件 \'Ad Hoc Distributed Queries\' 的访问 

        在Sql Server中查询一下Excel文件的时候出现问题:
    SELECT * FROM OPENROWSET( 'MICROSOFT.JET.OLEDB.4.0','Excel 8.0;IMEX=1;HDR=YES;DATABASE=D:\a.xls',[sheet1$])
        结果提示:
        SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
    查询相关资料,找到解决方法:

        启用Ad Hoc Distributed Queries:
    exec sp_configure 'show advanced options',1
    reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1
    reconfigure
        使用完成后,关闭Ad Hoc Distributed Queries:
    exec sp_configure 'Ad Hoc Distributed Queries',0
    reconfigure
    exec sp_configure 'show advanced options',0
    reconfigure 


    SELECT   *
    FROM      OPENDATASOURCE(
             'SQLOLEDB',
             'Data Source=ServerName;User ID=sa;Password=sa'
             ).DataBaseName.dbo.Table

    =====================================

    select * into destTbl from srcTbl
    insert into destTbl(fld1, fld2) select fld1, 5 from srcTbl

    以上两句都是将 srcTbl 的数据插入到 destTbl,但两句又有区别的:

        * 第一句(select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建。
        * 第二句(insert into select from)要求目标表(destTbl)存在,由于目标表已经存在,所以我们除了插入源表(srcTbl)的字段外,还可以插入常量,如例中的:5。

    1:执行另一服务器上的存储过程

    exec OPENDATASOURCE(
    ’SQLOLEDB’,
    ’Data Source=远程ip;User ID=sa;Password=密码’
    ).库名.dbo.存储过程名

    2:将资料插入另一服务器上的表中

    select * into 本地库名..表名 from OPENDATASOURCE(
    ’SQLOLEDB’,
    ’Data Source=远程ip;User ID=sa;Password=密码’
    ).库名.dbo.表名

    insert 本地库名..表名 select * from OPENDATASOURCE(
    ’SQLOLEDB’,
    ’Data Source=远程ip;User ID=sa;Password=密码’
    ).库名.dbo.表名

    或使用联结服务器:
    EXEC sp_addlinkedserver ’别名’,’’,’MSDASQL’,NULL,NULL,’DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码;’

    exec sp_addlinkedsrvlogin @rmtsrvname=’别名’,@useself=’false’,@locallogin=’sa’,@rmtuser=’sa’,@rmtpassword=’密码’
    GO

    (请注意上面的两步要同时运行)

    然后您就能够如下:
    select * from 别名.库名.dbo.表名
    insert 库名.dbo.表名 select * from 别名.库名.dbo.表名
    select * into 库名.dbo.新表名 from 别名.库名.dbo.表名 中国网管论坛 
    go


    3:假如在事务里使用连接服务器要加上分布式事务:
    两边启动dtc

    set XACT_ABORT on
    set ANSI_NULL_DFLT_ON on
    set ANSI_WARNINGS on

    BEGIN DISTRIBUTED TRANSACTION
    select * from OPENDATASOURCE(’MSDASQL’,’DRIVER={SQL Server};SERVER=ip;UID=sa;PWD=密码;’).pubs.dbo.jobs
    commit tran

  • 相关阅读:
    centos7下编译安装python3.7,且与python2.7.5共存
    Linux下的ctrl常用组合键
    命令 docker rm | docker rmi | docker prune 的差异
    docker操作命令大全和后台参数
    解决Linux下ssh登录后出现 报错 Write failed: Broken pipe 的方法
    在centos7 中docker info报错docker bridge-nf-call-iptables is disabled 的解决方法
    Linux下实现不活动用户登录超时后自动登出
    centos下非yum方式安装docker环境
    Git Error:There is no tracking information for the current branch.
    Vim操作:打开文件
  • 原文地址:https://www.cnblogs.com/jxinxin/p/2940171.html
Copyright © 2011-2022 走看看