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

SQL error when querying from a linked server (SQL Server linked to Oracle)

我在 SQL 服务器 select 来自 linked Oracle 数据库的某些查询中收到错误。该错误仅对某些 SELECT 语句发生,而对其他语句则不会。我正在尝试比较两台服务器上的数据,并获取存在于一台服务器上但另一台服务器上不存在的记录。

我知道 Oracle 数据库 link 有效,因为此查询 returns 预期结果:

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]
);

此查询与上述查询几乎相同,但只是尝试稍微过滤结果,returns 一条错误消息(仅最后一行不同):

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 provider "OraOLEDB.Oracle" for linked server "OraDevLink" returned message "ORA-01403: no data found".
Msg 7346, Level 16, State 2, Line 1
Cannot get the data of the row from the OLE DB provider "OraOLEDB.Oracle" for linked server "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]
);

但是这个returns和上面的错误信息一样:

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

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

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

这是我的解决方法:创建一个临时 table 并改用它。

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);

没有理由这样做是必要的,性能可能会受到影响,但至少它有效!