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);
没有理由这样做是必要的,性能可能会受到影响,但至少它有效!
我在 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);
没有理由这样做是必要的,性能可能会受到影响,但至少它有效!