oracle11g - 使用四部分名称访问 Oracle DB 作为 SQL Server 链接服务器时出现无效的列定义错误

标签 oracle11g sql-server-2008-r2 linked-server

我在 SQL Server 2008 R2 中设置了一个链接服务器,以便访问 Oracle 11g 数据库。 MSDASQL 提供程序用于通过 Oracle Instant Client ODBC 驱动程序连接到链接服务器。使用 OPENQUERY 时连接效果很好使用以下语法:

SELECT * 
FROM OPENQUERY(LINKED_SERVER, 'SELECT * FROM SCHEMA.TABLE')

但是,我尝试使用以下语法使用四部分名称:
SELECT * 
FROM LINKED_SERVER..SCHEMA.TABLE

我收到以下错误:

Msg 7318, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "LINKED_SERVER" returned an invalid column definition for table ""SCHEMA"."TABLE"".



有没有人知道我是什么原因导致四部分名称查询失败,而 OPENQUERY一个工作没有任何问题?

最佳答案

要遵循的正确路径是使用 OPENQUERY 函数,因为您的链接服务器是 Oracle:四名称语法对于 MSSQL 服务器来说可以正常工作,主要是因为它们理解 T-SQL。

对于非常简单的查询,由 4 部分组成的名称可能会意外地起作用,但如果您在真实场景中,则不会经常出现。在您的情况下,SELECT *正在返回所有列,在您的情况下,列定义之一与 SQL Server 不兼容。尝试另一个表或尝试选择一个简单的列(例如 CHAR 或 NUMBER),也许它可以正常工作。

无论如何,使用分布式查询有时会很棘手。数据库本身做 some optimizations在执行命令之前,因此让数据库知道它可以做什么和不能做什么很重要。如果 DB 认为链接服务器是 MSSQL,它将采取一些可能不适用于 Oracle 的操作。

当与 MSSQL 不同的链接数据库使用四部分名称语法时,您还会遇到其他问题,例如使用数据库内置函数(即 to_date() Oracle 函数将不起作用,因为 MSSQL 想要使用自己的 convert() 函数, 等等)。

同样,如果链接服务器不是 MSSQL,正确的选择是使用 OPENQUERY 并向它传递一个查询,该查询使用对链接服务器 SQL 方言有效的语法。

关于oracle11g - 使用四部分名称访问 Oracle DB 作为 SQL Server 链接服务器时出现无效的列定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291105/

相关文章:

oracle - ORA-03113 打开数据库时出错

sql - Oracle 中完全外连接的奇怪行为 - 如何解释?

sql - 两个查询。相同的输出。一个需要2小时,另一个需要0秒。为什么?

sql-server - 如何修复 SQL Server 错误 'Named Pipes Provider, error 40 - Could not open a connection to'?

grails - 从Grails服务调用PLSQL存储的proc

jdbc - java.lang.ArrayIndexOutOfBoundsException : 7

sql-server - 本地 SQL Server : The specified procedure could not be found

sql-server - SQL Server 2008 R2 有错误的默认排序规则

sql - 从字符串转换日期时间时转换失败

mysql - 从相同的 MySQL 链接服务器表 Where 子句更新本地 MSSQL 表