我在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
第一部作品;第二次抛出错误!
答案 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);
没有理由这是必要的,性能可能会受到打击,但至少它有效!