使用四个部件名称作为SQL Server链接服务器访问Oracle DB时,列定义错误无效

时间:2014-08-13 16:10:49

标签: 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
  OLE DB提供程序" MSDASQL"对于链接服务器" LINKED_SERVER"为表"" SCHEMA"返回了无效的列定义。" TABLE""。

OPENQUERY工作没有任何问题的情况下,是否有人对我的四部分名称查询失败有什么了解?

2 个答案:

答案 0 :(得分:7)

要遵循的正确路径是使用OPENQUERY函数,因为您的链接服务器是Oracle:四个名称语法适用于MSSQL服务器,主要是因为它们了解T-SQL。

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

在任何情况下,使用分布式查询有时会很棘手。数据库本身在执​​行命令之前会some optimizations,因此数据库必须知道它可以做什么以及它能做什么。如果数据库认为链接服务器是MSSQL,则需要采取一些可能不适用于Oracle的操作。

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

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

答案 1 :(得分:0)

如果您使用 Oracle 的 OLEDB 提供程序,您可以在不使用 openquery 的情况下进行查询