【问题标题】:Insert into table on the Linked Server with data from local table使用本地表中的数据插入链接服务器上的表中
【发布时间】:2016-04-11 22:53:55
【问题描述】:

我正在使用 SQL Server Express,我创建了一个连接到 Oracle 数据库的链接服务器。

如标题所示,我想将从本地表中选择的数据插入到链接服务器的表中。

我尝试了许多查询,但没有一个按我的意愿工作。

我使用的下面这个查询有效,但仅适用于静态值,但我想从本地数据库的表中动态插入数据。

INSERT OPENQUERY (ORTEST, 'SELECT * FROM reservation')
VALUES (2, '2', 3);

【问题讨论】:

  • 能否请您从本地数据库的表中动态澄清一下
  • 我要插入表中的数据(在链接服务器上)应该从本地数据库的表中选择
  • 我个人认为你是在倒退。原因是我不喜欢从本地推送到遥控器。从远程读取并在本地执行 DML 比在本地读取和远程执行 DML 要容易得多。什么具有不同的权限、语法等。我总是从远程提取并在本地存储。因此,在您的 Oracle 实例上,您需要建立与 SQL Server 的连接并获取数据。不是反过来。话虽如此,我对 oracle 的了解并不多。
  • OPENQUERY 在链接服务器上运行给定的查询。因此,除非您想使用动态 sql 构建整个 SQL 并运行它,否则它不适用于从 localDB 查询插入。 @Stephane 下面给出的答案似乎是正确的。

标签: sql-server oracle tsql linked-server openquery


【解决方案1】:

正确的语法

INSERT OPENQUERY(sql_server, 'SELECT a1,a2,a3 FROM database.schema.table_a') (a1, a2, a3)
SELECT b1, b2, b3 FROM database.schema.table_b;

【讨论】:

    【解决方案2】:

    它不能与 openquery 一起使用是正常的。要写入远程表,您必须在服务器级别设置链接服务器。这适用于 oracle,除非您有一个旧的 sql 版本。 这是在服务器端设置链接服务器的方法:

    exec master.dbo.sp_MSset_oledb_prop 'ORAOLEDB.Oracle', N'AllowInProcess', 1
    go
    exec sp_addlinkedserver @server = 'MyOracleServer', @srvproduct = 'Oracle', @provider = 'OraOLEDB.Oracle', @datasrc = 'MyOracleLinkedServer'
    go
    exec master.dbo.sp_serveroption @server=N'MyOracleServer', @optname=N'rpc out', @optvalue=N'true'
    go
    sp_addlinkedsrvlogin @rmtsrvname = N'MyOracleServer', @useself = 'false', @locallogin = NULL, @rmtuser = 'myRemoteUser', @rmtpassword ='myRemotePassword'
    go
    

    然后您可以继续进行常规查询:

    insert into [MyOracleServer]..[MyRemoteSchema].[MyRemoteTable](
      [MyRemoteField1],
      [MyRemoteField2]
    )
    select 
      t.Field1,
      t.Field2
    from
      [dbo].[MyLocalTable] as t
    

    如果您想了解更多详细信息,请查看以下两个链接: https://www.mssqltips.com/sqlservertip/4396/creating-a-sql-server-2014-linked-server-for-an-oracle-11g-database/

    https://www.mssqltips.com/sqlservertip/4414/transferring-data-between-sql-server-2014-and-oracle-11g-databases/

    【讨论】:

      【解决方案3】:

      您应该能够使用链接服务器名称作为限定表名称的一部分,然后只需在 select 中执行正常插入:

      INSERT INTO ORTEST.[dbname].[dbo].[reservation]
      SELECT * from [dbname].[db].[reservation]
      

      【讨论】:

      • 感谢您的回答,但没有奏效,必须记住链接服务器是 Oracle 数据库
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多