无法在链接服务器上运行 openquery

Posted

技术标签:

【中文标题】无法在链接服务器上运行 openquery【英文标题】:Cannot run openquery on linked server 【发布时间】:2017-10-13 05:49:57 【问题描述】:

我正在链接服务器 (IBM DB2) 上运行查询,这样做的原因是执行简单查询需要花费大量时间。 下面是两个查询,第一个运行成功,所以问题不在于查询

 select top 10 * from [AS400TS_LNK].[TEST].[AUPRDDBF].CONTACCT where  actrno = '8971'  

  select * from openquery(AS400TS_LNK, 'select * from [TEST].[AUPRDDBF].CONTACCT where  actrno = ''8971''')

以及我在运行打开查询时遇到的错误

链接服务器“AS400TS_LNK”的 OLE DB 提供程序“DB2OLEDB”返回消息“令牌 *N 无效。有效令牌:*N。SQLSTATE:42601,SQLCODE:-104”。

消息 7321,第 16 级,状态 2,第 1 行

准备查询“select * from [AS400TS_LNK].[TEST].[AUPRDDBF].CONTACCT where actrno = '8971'”以针对链接服务器“AS400TS_LNK”的 OLE DB 提供程序“DB2OLEDB”执行时出错。

【问题讨论】:

这里只是一个疯狂的猜测,但很容易测试。尝试从openquery 语句中删除方括号... 正如@user1429080 提到的,使用方括号来引用标识符是SQL Server 的事情;将标准 SQL 发送到远程服务器,必要时使用双引号作为标识符(无论如何这里不是这种情况)。 【参考方案1】:

试试这个:

select * 
from openquery(AS400TS_LNK, 'select * from TEST.AUPRDDBF.CONTACCT where actrno = ''8971''')

或者,如果失败了,试试这个:

select * 
from openquery(AS400TS_LNK, 'select * from TEST.AUPRDDBF.CONTACCT') 
where actrno = '8971'

【讨论】:

以上是关于无法在链接服务器上运行 openquery的主要内容,如果未能解决你的问题,请参考以下文章

消息 7391:链接服务器无法开始分布式事务(两个 svrs 在本地运行)

使用 Openquery 链接服务器更新表

SQL链接服务器查询-OPENQUERY的使用

使用 OPENQUERY 语法通过链接服务器 (SQL Server 2005) 调用 MySQL 存储过程(带参数)的问题

DB2 到 SQL 链接服务器 OpenQuery 非 Ascii 字符问题

使用 openquery 运行 MDX 查询时出现错误代码 7321