Sql server sql server链接到oracle的服务器在数据存在时未返回任何数据
我在SQL server中有一个链接服务器设置,用于访问Oracle数据库。我在SQL Server中有一个查询,它使用点表示法连接Oracle表。我从Oracle收到“未找到数据”错误。在Oracle方面,我使用的是表,而不是视图,并且不涉及存储过程 首先,当没有数据时,我应该只得到零行,而不是一个错误。 第二,在这种情况下,实际上应该有数据。 第三,我只看到PL/SQL代码中的ORA-01403错误;从来没有在SQL中使用过 这是完整的错误消息: 链接服务器OM_Oracle的OLE DB提供程序OraOLEDB.Oracle返回消息ORA-01403:未找到任何数据。 信息7346,16级,状态2,第1行 无法从链接服务器OM_Oracle的OLE DB提供程序OraOLEDB.Oracle获取行的数据 这里有一些更详细的信息,但可能没有任何意义,因为您没有我的表和数据。 这是有问题的查询:Sql server sql server链接到oracle的服务器在数据存在时未返回任何数据,sql-server,linked-server,ora-01403,Sql Server,Linked Server,Ora 01403,我在SQL server中有一个链接服务器设置,用于访问Oracle数据库。我在SQL Server中有一个查询,它使用点表示法连接Oracle表。我从Oracle收到“未找到数据”错误。在Oracle方面,我使用的是表,而不是视图,并且不涉及存储过程 首先,当没有数据时,我应该只得到零行,而不是一个错误。 第二,在这种情况下,实际上应该有数据。 第三,我只看到PL/SQL代码中的ORA-01403错误;从来没有在SQL中使用过 这是完整的错误消息: 链接服务器OM_Oracle的OLE DB提
select *
from eopf.Batch b join eopf.BatchFile bf
on b.BatchID = bf.BatchID
left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du
on bf.ReferenceID = du.documentUploadID;
我不明白为什么会出现“找不到数据”错误。下面的查询使用相同的Oracle表,不返回任何数据,但我没有得到错误-我只是没有返回任何行
select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID = -1
下面的查询返回数据。我刚刚从联接中删除了一个SQL Server表。但在这两种情况下,删除批处理表不会更改从batchFile 271行返回的行–batchFile中的所有行都有一个批处理条目。它仍然应该将相同的批处理文件行连接到相同的Oracle行
select *
from eopf.BatchFile bf
left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du
on bf.ReferenceID = du.documentUploadID;
这个查询返回5行。它应该与原始查询中的5相同。我不能使用它,因为我需要来自batch和batchFile表的数据
select *
from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du
where du.documentUploadId
in
(
select bf.ReferenceID
from eopf.Batch b join eopf.BatchFile bf
on b.BatchID = bf.BatchID);
有人遇到过这个错误吗?我也遇到过同样的问题。
解决方案1:将Oracle数据库中的数据加载到一个临时表中,然后连接到该临时表-下面是示例
从这篇文章中,你可以发现问题可能与使用左连接有关。
我已经检查了我的问题,在更改查询后,它解决了问题。在我的例子中,我有一个由链接表生成的复杂视图,3个基于链接表和本地表的视图。我一直在使用内部联接,这个问题就显现出来了。根据需要将联接更改为左和右外部联接解决了该问题。我通过避免使用=运算符解决了该问题。请尝试使用此选项:
select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID < 0
解决此问题的另一种方法是将Oracle数据拉回到数据库中。这将导致SQLServer退出并从Oracle检索所有数据,并将其放入结果表变量中。出于所有目的,如果在查询中使用结果表值函数,则Oracle数据现在是SQL Server的本地数据 我认为最初的问题是SQL Server正在尝试优化复合查询的执行,其中包括远程Oracle查询结果。通过使用表值函数包装Oracle调用,SQL Server将对函数返回的结果表变量而不是远程查询执行的结果优化复合查询
CREATE function [dbo].[documents]()
returns @results TABLE (
DOCUMENT_ID INT NOT NULL,
TITLE VARCHAR(6) NOT NULL,
LEGALNAME VARCHAR(50) NOT NULL,
AUTHOR_ID INT NOT NULL,
DOCUMENT_TYPE VARCHAR(1) NOT NULL,
LAST_UPDATE DATETIME
) AS
BEGIN
INSERT INTO @results
SELECT CAST(DOCUMENT_ID AS INT) AS DOCUMENT_ID, TITLE, LEGALNAME, CAST(AUTHOR_ID AS INT) AS AUTHOR_ID, DOCUMENT_TYPE, LAST_UPDATE
FROM OPENQUERY(ORACLE_SERVER,
'select DOCUMENT_ID, TITLE, LEGALNAME, AUTHOR_ID, DOCUMENT_TYPE, FUNDTYPE, LAST_UPDATE
from documents')
return
END
然后,您可以将表值函数用作SQL查询中的表:
从文档中选择*今天我遇到了与内部联接相同的问题。由于创建建议人、使用建议人或更改建议人都不是我的选择,我想与大家分享我的解决方案 我曾经将查询优化器推向正确的方向,因为问题似乎是由本地远程表的嵌套循环连接策略引起的。对我来说,哈希、合并和远程连接提示都很有效 对于您来说,远程将不是一个选项,因为它只能用于内部联接操作。因此,使用类似下面的方法应该是可行的 挑选* 来自eopf.批次b 加入eopf.batchbf文件 在b.BatchID=bf.BatchID上 左侧外部合并联接[OM_ORACLE]…[OM]。[DOCUMENT_UPLOAD]du 在bf.ReferenceID=du.documentUploadID上;