MSSQL链接服务器错误:链接服务器的OLE DB提供程序“OraOLEDB.Oracle”为列提供了不一致的元数据

时间:2016-06-06 13:03:38

标签: sql-server oracle linked-server

我试图使用链接服务器将数据从Oracle提取到pointer-events: none;数据库。

MSSqlserver

但它失败了以下错误:

  

链接服务器“LINK_NAME”的OLE DB提供程序“OraOLEDB.Oracle”   为列提供了不一致的元数据。 “COLUMN_NAME”栏   (编译时序号6)对象“”SCHEMA“。”表“”被报告给   在编译时具有100的“LENGTH”,在运行时具有200的“LENGTH”。

我还需要在运行时传递参数where where condition。我发现OPENQUERY是一个解决方案,但它在运行时不支持参数。

3 个答案:

答案 0 :(得分:1)

尝试使用OPENQUERY语法来查看是否有帮助..

SELECT * FROM OPENQUERY(LINK_NAME, 'SELECT * FROM db.Schema.Table')

有关OPENQUERY ...

的更多信息

答案 1 :(得分:1)

我找到了解决方案:

由于数据库列类型不匹配导致错误。 ORACLE 正在使用NVARCHAR作为数据类型,但在 SQLSERVER 的情况下,它是VARCHAR

由于 NVARCHAR VARCHAR 的两倍,这就是显示尺寸不匹配错误的原因。

将数据类型更改为同样适用于我。

答案 2 :(得分:0)

我找到了this blogger发布的解决方案。试试吧!

  

来自Sysinternals / Mark Russinovich的这个工具是最好的,我唯一的遗憾是那天没有推出它而不是淘到谷歌并且疯了。我将Procmon限制为仅仅sqlservr.exe,因为它是加载/处理提供程序而不是ssms.exe的SQL服务本身。另外值得注意的是,sqlservr.exe是64位进程,而管理工作室仍然只有32位。由于服务器服务正在加载提供程序,并且服务进程为64位,因此提供程序也必须以64位格式提供。

     

ODAC112021Xcopy_x64.zip已安装到C:\ Oracle。然而,Procmon向我展示的是,sqlservr试图在任何文件夹中找到oci.dll但是他的! (它遍历%Path%sysvariable)。当它最终放弃查找dll时,SQL服务处于不稳定的状态,停止服务的唯一方法是通过taskmgr / procexp将其终止。显然,我可以看到“xcopy”部署 - 虽然没有给我任何错误消息 - 它也没有设置PATH变量!这就是这篇文章的真正含义......将C:\ Oracle和C:\ Oracle \ Bin添加到Path变量中,或者可能是在过程中使用调查工具而不是依赖于您的搜索引擎技能。

     

sqlservr.exe现在可以找到相关的DLL了。根目录中的OCI.DLL和Bin子文件夹中的OraOLEDB11.DLL。此时我可以查询数据库!如果您按照上述步骤操作并仍然遇到相同的错误,我强烈建议您使用Procmon.exe,而不是跳转到下一个搜索结果。

完整帖子为here,其中包含更多详细信息。