【问题标题】:Error trying to Select x rows from DB2 (V4R5M0) via sql server linked server using OPENQUERY尝试使用 OPENQUERY 通过 sql server 链接服务器从 DB2 (V4R5M0) 中选择 x 行时出错
【发布时间】:2013-05-31 13:21:42
【问题描述】:

我有一个使用 OLE DB 提供程序“IBMDA400”从 SQL Server 2008 R2 到 DB2 数据库 (V4R5M0) 的链接服务器

链接服务器详细信息

EXEC master.dbo.sp_addlinkedserver 
     @server = N'JTEST', @srvproduct=N'IBM OLE DB Provider for DB2', 
     @provider=N'IBMDA400', @datasrc=N'TestName'

这很好用:

SELECT * FROM OPENQUERY(JTEST, 'Select * from QSYS2.SYSCOLUMNS')

但是下面的语句会产生错误:

SELECT * FROM OPENQUERY(JTEST, 'Select * from QSYS2.SYSCOLUMNS FETCH FIRST 10 ROWS ONLY')

错误

链接服务器“JTEST”的 LE DB 提供程序“IBMDA400”返回消息 “SQL0199:不需要关键字 FETCH。有效标记:FOR WITH ORDER 联盟优化。原因 。 . . . . : 关键字 FETCH 不是预期的 这里。在关键字 FETCH 中检测到语法错误。部分名单 有效令牌的数量为 FOR WITH ORDER UNION OPTIMIZE。此列表假设 该语句在意外关键字之前是正确的。错误 可能在语句的前面,但语句的语法似乎 到此为止有效。恢复 。 . . : 检查 SQL 在指定关键字的区域中声明。冒号或 SQL 可能缺少分隔符。 SQL 要求对保留字进行分隔 当它们被用作名称时。更正 SQL 语句并尝试 再次请求。”。消息 7321,级别 16,状态 2,行 1 发生错误 在准备查询“Select * from QSYS2.SYSCOLUMNS FETCH FIRST 10 ROWS ONLY" 用于针对 OLE DB 提供程序 "IBMDA400" 执行 链接服务器“JTEST”。

我认为这是因为这个版本的 DB2 不支持 FETCH FIRST X ROWS ONLY?但是这个版本有没有办法只选择有限的记录集呢?

【问题讨论】:

    标签: sql sql-server-2008 db2 linked-server openquery


    【解决方案1】:

    FETCH FIRST 不需要 ORDER BY 吗?否则,它会得到哪 10 行?

    据我在 DB2 SQL 文档中看到的,当前和旧版本都支持它,尽管它没有说明(也不清楚)ORDER BY 是否对于 FETCH FIRST 是强制性的

    【讨论】:

    • 添加订购者,并没有解决所面临的问题。它也出现了一个新错误:链接服务器“JTEST”的 OLE DB 提供程序“IBMDA400”返回消息“SQL0199:不期望关键字 FETCH。有效标记:。原因......:关键字 FETCH这里不是预期的。在关键字 FETCH 处检测到语法错误。有效标记的部分列表是 。此列表假定语句在意外关键字之前是正确的。
    • 请问您正在查看哪些 DB2 SQL 文档?
    【解决方案2】:

    Fetch first 子句仅适用于 V5R1 OS400 版本。 V4R5M0 太旧了

    有一个解决方法: 选择 * 从 (
    SELECT syscolumns.* , row_number() over() as nre FROM syscolumns
    ORDER BY COLUMN_NAME ) 作为列
    其中 nre

    你可以试试


    DEpe

    【讨论】:

    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多