Sql server 在没有分布式事务的情况下从非常大的OPENQUERY插入结果

Sql server 在没有分布式事务的情况下从非常大的OPENQUERY插入结果,sql-server,oracle11g,linked-server,sql-server-2014,openquery,Sql Server,Oracle11g,Linked Server,Sql Server 2014,Openquery,我试图从一个命中链接的Oracle 11g服务器的查询中将行插入到Microsoft SQL Server 2014表中。我对链接服务器具有只读访问权限。我通常使用OPENQUERY来执行以下操作: INSERT INTO <TABLE> SELECT * FROM OPENQUERY(LINKED_SERVER, <SQL>) INSERT INTO <TABLE> EXECUTE(<SQL>) AT LINKED_SERVER 但是,这似乎

我试图从一个命中链接的Oracle 11g服务器的查询中将行插入到Microsoft SQL Server 2014表中。我对链接服务器具有只读访问权限。我通常使用
OPENQUERY
来执行以下操作:

INSERT INTO <TABLE> SELECT * FROM OPENQUERY(LINKED_SERVER, <SQL>)
INSERT INTO <TABLE> EXECUTE(<SQL>) AT LINKED_SERVER

但是,这似乎要求在链接服务器上启用分布式事务,而这不是本项目的选项。我还缺少其他可能的解决方案吗?

如果安装了SQL Server Integration Services,您可以使用SSIS包来实现这一点。SQL Server导入/导出向导可以为您自动化许多包配置/设置

下面是上一个问题,其中包含有关SSI到Oracle的一些有用链接:

如果您对通过T-SQL运行它感兴趣,下面是一篇关于从存储过程执行SSIS包的文章:


我以前也遇到过类似的情况,对我来说有效的方法是分解大型查询字符串,同时仍然使用下面的查询方法。(我没有SSIS的奢侈)

来自OPENQUERY的
(链接的_服务器,
  • 不要直接插入到表中,而是首先将主要结果集移动到本地临时登录表中(可以是物理表或临时表)
  • 通过将转换和业务逻辑代码移动到查询之外的SQL Server边界,分解查询
  • 如果在查询中有联接,则将这些结果集也带到sqlserver,然后在本地联接到主结果集
  • 最后在本地执行插入
  • 清理你的集结区
  • 有多种方法(如在视图中包装打开的查询),但我喜欢灵活性,并发现将打开的查询的大小减少到最小,在本地存储和转换会产生更好的结果


    希望这能有所帮助。

    如果禁用“远程进程事务升级”链接服务器选项,您的第二种方法能否正常工作

    EXEC master.dbo.sp_serveroption
        @server = 'YourLinkedServerName',
        @optname = 'remote proc transaction promotion',
        @optvalue = 'false'
    

    这是一个存储过程,而不是一个临时查询。既然答案如此直截了当,我对这个问题感到有点不好意思。为了在没有分布式事务的链接服务器上运行查询,需要禁用该链接服务器的分布式事务。我天真地认为,如果SQL Server既不可能也不需要,那么它将足够聪明,不会尝试这样做。谢谢
    EXEC master.dbo.sp_serveroption
        @server = 'YourLinkedServerName',
        @optname = 'remote proc transaction promotion',
        @optvalue = 'false'