OLE DB 提供程序'对于链接服务器返回的数据与

问题描述 投票:0回答:3

我通过链接服务器从我的 sql server 2017 Standard 查询远程 postgresql 服务器时遇到错误

这是查询:

    SELECT CAST(test AS VARCHAR(MAX))  FROM  OpenQuery(xxxx, 
     'SELECT  corpo::TEXT as test From public.notification')

这是错误消息:

    Msg 7347, Level 16, State 1, Line 57
    OLE DB provider 'MSDASQL' for linked server 'xxx' returned data that                 does not match expected data length for 
    column '[MSDASQL].test'. The (maximum) expected data length is 1024,         while the returned data length is 7774.

即使没有转换,错误仍然存在

对于 odbc 和链接服务器,我遵循了这个方便的指南

linked-server sql-server-2017
3个回答
4
投票

就我而言,我是通过视图读取数据。显然,基础表中一列的数据大小已更改,但视图仍然向链接服务器报告该列的原始较小大小。解决方案是用MSSMS打开视图并再次保存。


2
投票

你能试试这个吗?

SELECT  *
FROM    OPENQUERY(xxxx, '\
SELECT  TRIM(corpo) AS test
FROM    public.notification;
') AS oq
  1. 我更喜欢使用 OPENQUERY,因为它会将精确的查询发送到链接服务器以供其执行。
  2. MySQL 目前在转换为
    VARCHAR
    数据类型时存在问题,所以我使用
    TRIM()
    函数来欺骗它。

0
投票

我知道这是一篇 5 年前的帖子,但我见过的任何地方都没有人为这个问题提供有效的解决方案。

我在 Windows Server 2019 标准操作系统上运行 MS SQL Server 2019。我还有最新的 Simba Spark ODBC 驱动程序,并创建了一个链接服务器,效果很好。 不过我们有一张桌子可以放备忘录。此表的系统和手册文本在 Azure Databricks 中定义为字符串,可以包含数千个字符。从 Azure Databricks 提取长字符串时,基于我读过的每条建议的每一次尝试都失败了。直到我想出了这个分段查询。 使用 SUBSTRING 命令分解列文本,然后将其重新拼接在一起。看起来像这样:

SELECT ID, TXTPART1 + TXTPART2 + TXTPART3 AS MEMO_TXT
FROM OPENQUERY([LinkedServerName], 'SELECT ID, 
SUBSTRING(<FIELD NAME>, 1, 255) AS TXTPART1,
SUBSTRING(<FIELD NAME>, 256, 255) AS TXTPART2,
SUBSTRING(<FIELD NAME>, 511, 255) AS TXTPART3
FROM TABLE_NAME
WHERE <whatever>
')

就我而言,我取出了 33 个部分来捕获 8,161 个可能的字符。它工作完美。 是的,这很痛苦而且丑陋,但是很实用,并且可以解决我们许多人面临的问题,直到 Microsoft 和 Simba 解决这个问题。 我希望这可以帮助任何遇到 MSDASQL 问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.