我通过链接服务器从我的 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 和链接服务器,我遵循了这个方便的指南。
就我而言,我是通过视图读取数据。显然,基础表中一列的数据大小已更改,但视图仍然向链接服务器报告该列的原始较小大小。解决方案是用MSSMS打开视图并再次保存。
你能试试这个吗?
SELECT *
FROM OPENQUERY(xxxx, '\
SELECT TRIM(corpo) AS test
FROM public.notification;
') AS oq
VARCHAR
数据类型时存在问题,所以我使用 TRIM()
函数来欺骗它。我知道这是一篇 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 问题的人。