简体   繁体   English

尝试通过使用OPENQUERY的SQL Server链接服务器从DB2(V4R5M0)选择x行时出错

[英]Error trying to Select x rows from DB2 (V4R5M0) via sql server linked server using OPENQUERY

I have a Linked Server from SQL Server 2008 R2, to a DB2 Database (V4R5M0) using OLE DB provider "IBMDA400" 我有一个使用OLE DB提供程序“ IBMDA400”从SQL Server 2008 R2链接到DB2数据库(V4R5M0)的链接服务器。

Linked Server Detials 链接服务器细节

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

This works fine: 这很好用:

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

But the following statement produces an error: 但是以下语句会产生错误:

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

Error 错误

LE DB provider "IBMDA400" for linked server "JTEST" returned message "SQL0199: Keyword FETCH not expected. Valid tokens: FOR WITH ORDER UNION OPTIMIZE. Cause . . . . . : The keyword FETCH was not expected here. A syntax error was detected at keyword FETCH. The partial list of valid tokens is FOR WITH ORDER UNION OPTIMIZE. This list assumes that the statement is correct up to the unexpected keyword. The error may be earlier in the statement but the syntax of the statement seems to be valid up to this point. Recovery . . . : Examine the SQL statement in the area of the specified keyword. A colon or SQL delimiter may be missing. SQL requires reserved words to be delimited when they are used as a name. Correct the SQL statement and try the request again.". 链接服务器“ JTEST”的LE DB提供程序“ IBMDA400”返回消息“ SQL0199:不期望关键字FETCH。有效标记:FOR WITH ORDER UNION OPTIMIZE。原因... ::此处不期望关键字FETCH。语法错误为在关键字FETCH处检测到。有效标记的部分列表为FOR WITH ORDER UNION OPTIMIZE。此列表假定该语句在意外关键字之前是正确的。该错误可能早于该语句,但该语句的语法似乎有效恢复到此为止:检查指定的关键字区域中的SQL语句。可能缺少冒号或SQL分隔符。SQL要求将保留字用作名称时对其进行分隔。更正SQL语句然后重试该请求。”。 Msg 7321, Level 16, State 2, Line 1 An error occurred while preparing the query "Select * from QSYS2.SYSCOLUMNS FETCH FIRST 10 ROWS ONLY" for execution against OLE DB provider "IBMDA400" for linked server "JTEST". 消息7321,级别16,状态2,行1准备针对链接服务器“ JTEST”的OLE DB提供程序“ IBMDA400”执行查询“仅从QSYS2.SYSCOLUMNS仅获取前10行的查询*”时发生错误。

I think it's because FETCH FIRST X ROWS ONLY is not supported in this version of DB2? 我认为是因为此版本的DB2不支持FETCH FIRST X ROWS ONLY? But is there any way of selecting only a limited record set in this version? 但是,有什么方法只能选择此版本中的受限记录集吗?

Wouldn't FETCH FIRST need an ORDER BY? FETCH首先不需要ORDER BY吗? Otherwise, which 10 rows would it get? 否则,它将获得哪10行?

As far as I can see in the DB2 SQL docs, it is supported on current and older versions, although it doesn't state (and it not clear) if ORDER BY is mandatory with FETCH FIRST 据我在DB2 SQL文档中所看到的,它在当前版本和较早版本上都受支持,尽管并没有说明(并且不清楚)在FETCH FIRST中是否必须使用ORDER BY

Fetch first clause work only from V5R1 OS400 version. 仅从V5R1 OS400版本获取第一子句。 V4R5M0 is too old V4R5M0太旧

There's a workaround: select * from ( 有一种解决方法:从(
SELECT syscolumns.* , row_number() over() as nre FROM syscolumns SELECT syscolumns。*,row_number()over()as nre FROM syscolumns
ORDER BY COLUMN_NAME ) as columns ORDER BY COLUMN_NAME)作为列
where nre<10 nre <10

You can try it 你可以试试


DEpe DEPE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM