【问题标题】:How to populate results of EXECUTE (@myQuery) AT [LinkedServer] Into Temp Table from Oracle Query如何从 Oracle Query 将 EXECUTE (@myQuery) AT [LinkedServer] 的结果填充到临时表中
【发布时间】:2019-09-05 12:45:56
【问题描述】:

我在 MSSQL Server 中有一个链接的 Oracle 服务器,我正在尝试将查询结果返回到临时表中。查询超过 8,000 个字符,所以我不能使用我通常使用的 OPENQUERY()。我可以运行以下命令,并查看启用 RPC 后的结果。

/*
Declare query variable, since query is more than 8,000 characters
*/
DECLARE @myQuery VARCHAR(MAX)

/*
Set query
*/
SET @myQuery = 'Query text here'

EXECUTE (@myQuery) AT ServerName

到目前为止我已经尝试过:

/* 
Declare query variable, since query is more than 8,000 characters 
*/ 
DECLARE @myQuery VARCHAR(max) 

/* 
Create temp table 
*/ 
CREATE TABLE ##temptable
  ( 
     field NVARCHAR(50) 
  ) 

/* 
Set query 
*/ 
SET @myQuery = 'Query text here' 

INSERT INTO temptable(field)
EXECUTE (@myQuery) at servername 

但是,这会从 MSSQL 返回以下错误消息:

链接服务器“ServerName”的 OLE DB 提供程序“OraOLEDB.Oracle” 返回消息“无法加入交易。”。消息 7391, Level #, State #, Line # 操作无法执行 因为链接服务器“ServerName”的 OLE DB 提供程序“OraOLEDB.Oracle” 无法开始分布式事务。

非常感谢任何帮助/指导。

更新

我尝试了以下方法,它返回了相同的消息。

/*  
Declare query variable, since query is more than 8,000 characters
*/  
DECLARE @myQuery VARCHAR(max) 

/*  
Set query  
*/  
SET @myQuery = 'Query text here' 

DECLARE @table TABLE(  field NVARCHAR(50) ) 

INSERT INTO @table(field)
EXECUTE (@myQuery) at servername

【问题讨论】:

  • 你试过用表变量代替临时表吗?
  • @PeterHE 是的;我试图用该字段声明一个表,然后将其插入其中,我得到了相同的消息。
  • 您可以尝试将远程调用 sql 包装到一个 SP (sp1) 中的 Oracle t,然后在您的主 SP 中调用该 SP,如:INSERT EXEC sp1

标签: sql-server oracle


【解决方案1】:

更新给将来来到这里的任何人,我能够通过以下方式解决问题:

首先是设置本地 DTC - 请参阅 Windows Server 2012 分布式事务协调器。

第二个是,在每个链接服务器的属性中,将“启用分布式事务提升”设置为 FALSE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多