从链接服务器查询时出现SQL错误(链接到Oracle的SQL Server)

时间:2016-03-24 15:53:35

标签: sql-server oracle linked-server

我在SQL Server中从链接的Oracle数据库中选择的某些查询时收到错误。仅对某些SELECT语句而不是其他语句发生错误。我试图比较两台服务器上的数据,并获取存在于一台服务器而不是另一台服务器上的记录。

我知道Oracle数据库链接有效,因为此查询返回了预期的结果:

SELECT TABLE_ID
FROM   [OraDevLink]..[SCHEMA].[MY_TABLE];

这是另一个正常工作的查询:

SELECT *
FROM   dbo.MY_TABLE
WHERE  TABLE_ID NOT IN
(
    SELECT TABLE_ID
    FROM   [OraDevLink]..[SCHEMA].[MY_TABLE]
);

这个查询几乎与上面的查询相同但只是尝试过滤一下结果,返回错误信息(只有最后一行不同):

SELECT *
FROM   dbo.MY_TABLE
WHERE  TABLE_ID NOT IN
(
    SELECT TABLE_ID
    FROM   [OraDevLink]..[SCHEMA].[MY_TABLE]
)
AND    TABLE_ID IN(0, 100);

以下是错误消息:

  

OLE DB提供程序" OraOLEDB.Oracle"对于链接服务器" OraDevLink"返回消息" ORA-01403:未找到数据"。
  Msg 7346,Level 16,State 2,Line 1
  无法从OLE DB提供程序获取该行的数据" OraOLEDB.Oracle"对于链接服务器" OraDevLink"。

我最终想要做的是运行INSERT语句来查找丢失的记录(但是使用过滤器)。这可以正常工作:

INSERT INTO [OraDevLink]..[SCHEMA].[MY_TABLE]
( TABLE_ID )
SELECT TABLE_ID
FROM   dbo.MY_TABLE
WHERE  TABLE_ID NOT IN
(
    SELECT TABLE_ID
    FROM   [OraDevLink]..[SCHEMA].[MY_TABLE]
);

但是这会返回相同的上述错误消息:

INSERT INTO [OraDevLink]..[SCHEMA].[MY_TABLE]
( TABLE_ID )
SELECT TABLE_ID
FROM   dbo.MY_TABLE
WHERE  DEPT_ID = 1 -- this is the only change
AND    TABLE_ID NOT IN
(
    SELECT TABLE_ID
    FROM   [OraDevLink]..[SCHEMA].[MY_TABLE]
);

修改

情况变得更糟。看看你是否能发现这两个查询之间的区别:

SELECT *
FROM   dbo.MY_TABLE
WHERE  TABLE_ID NOT IN
(
    SELECT TABLE_ID
    FROM   [OraDevLink]..[SCHEMA].[MY_TABLE]
)
AND    TABLE_ID IN(0);

SELECT *
FROM   dbo.MY_TABLE
WHERE  TABLE_ID NOT IN
(
    SELECT TABLE_ID
    FROM   [OraDevLink]..[SCHEMA].[MY_TABLE]
)
AND    TABLE_ID IN(0, 100); -- <-Hint

第一部作品;第二次抛出错误!

1 个答案:

答案 0 :(得分:2)

我只能假设这是一个错误。此行为没有其他解释。

以下是我的解决方法:创建一个临时表并使用它。

SELECT TABLE_ID
INTO #temp_table
FROM   [OraDevLink]..[SCHEMA].[MY_TABLE];

SELECT *
FROM   dbo.MY_TABLE
WHERE  TABLE_ID NOT IN
(
    SELECT TABLE_ID
    FROM   #temp_table
)
AND    TABLE_ID IN(0, 100);

没有理由这是必要的,性能可能会受到打击,但至少它有效!