【问题标题】:MSSQL Linked Server error: The OLE DB provider "OraOLEDB.Oracle" for linked server supplied inconsistent metadata for a columnMSSQL 链接服务器错误:链接服务器的 OLE DB 提供程序“OraOLEDB.Oracle”为列提供了不一致的元数据
【发布时间】:2016-10-06 02:38:18
【问题描述】:

我试图使用链接服务器将数据从 Oracle 提取到 MSSqlserver 数据库。

select * from [LINK_NAME]..SCHEMA.TABLE;

但它失败并出现以下错误:

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

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

【问题讨论】:

    标签: sql-server oracle linked-server


    【解决方案1】:

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

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

    更多关于OPENQUERY ...

    【讨论】:

    • 对不起,我忘了提,但我需要在 where 子句中传递参数...但是 OPENQUERY 不支持参数。
    【解决方案2】:

    我找到了解决方案:

    由于数据库列类型不匹配而出现错误。 ORACLE 使用 NVARCHAR 作为数据类型,但对于 SQLSERVER,它是 VARCHAR

    由于 NVARCHARVARCHAR 大小的两倍,这就是它显示大小不匹配错误的原因。

    将数据类型更改为相同对我有用。

    【讨论】:

      【解决方案3】:

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

      Sysinternals/Mark Russinovich 的这个工具是最好的,那天我唯一的遗憾是没有早点启动它,而不是搜索谷歌并发疯。我将 Procmon 限制为 sqlservr.exe,因为加载/处理提供程序的是 SQL 服务本身,而不是 ssms.exe。另外值得注意的是 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,并提供更多详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        • 1970-01-01
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多