Ошибка при попытке выбрать x строк из DB2 (V4R5M0) через сервер, связанный с sql server, с помощью OPENQUERY

У меня есть связанный сервер из SQL Server 2008 R2 в базу данных DB2 (V4R5M0) с использованием поставщика OLE DB "IBMDA400"

Сведения о связанном сервере

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')

Ошибка

Поставщик LE DB "IBMDA400" для связанного сервера "JTEST" вернул сообщение "SQL0199: Ключевое слово FETCH не ожидается. Допустимые токены: FOR WITH ORDER UNION OPTIMIZE. Причина . . . . . : Ключевое слово FETCH здесь не ожидалось. Произошла синтаксическая ошибка. обнаружено по ключевому слову FETCH. Частичный список допустимых токенов: FOR WITH ORDER UNION OPTIMIZE. Этот список предполагает, что инструкция верна до неожиданного ключевого слова. Ошибка может быть в инструкции раньше, но синтаксис инструкции кажется допустимым. до этого момента. Восстановление...: Проверьте оператор SQL в области указанного ключевого слова. Может отсутствовать двоеточие или разделитель SQL. SQL требует, чтобы зарезервированные слова были разделены, когда они используются в качестве имени. Исправьте оператор SQL. и повторите запрос.". Сообщение 7321, уровень 16, состояние 2, строка 1 Произошла ошибка при подготовке запроса «Выбрать * из QSYS2.SYSCOLUMNS FETCH FIRST 10 ROWS ONLY» для выполнения поставщика OLE DB «IBMDA400» для связанного сервера «JTEST».

Я думаю, это потому, что FETCH FIRST X ROWS ONLY не поддерживается в этой версии DB2? Но есть ли способ выбрать только ограниченный набор записей в этой версии?


person TomEaton    schedule 31.05.2013    source источник


Ответы (2)


Разве FETCH FIRST не нужен ORDER BY? В противном случае, какие 10 строк он получил бы?

Насколько я вижу в документах по SQL DB2, он поддерживается в текущей и более старых версиях, хотя в нем не указано (и не ясно), является ли ORDER BY обязательным с FETCH FIRST

person gbn    schedule 31.05.2013
comment
Добавление Order By не решило проблему. Он также представил новую ошибку: поставщик OLE DB IBMDA400 для связанного сервера JTEST вернул сообщение SQL0199: Keyword FETCH не ожидается. Допустимые токены: ‹END-OF-STATEMENT›. Причина . . . . . : ключевое слово FETCH здесь не ожидалось. Обнаружена синтаксическая ошибка в ключевом слове FETCH. Частичный список допустимых токенов — ‹END-OF-STATEMENT›. Этот список предполагает, что утверждение правильно до неожиданного ключевого слова. - person TomEaton; 04.06.2013
comment
Какие документы DB2 SQL вы просматриваете? - person TomEaton; 06.06.2013

Предложение Fetch first работает только с версии V5R1 OS400. V4R5M0 слишком старый

Есть обходной путь: выберите * из (
SELECT syscolumns.* , row_number() over() as nre FROM syscolumns
ORDER BY COLUMN_NAME ) as columns
где nre‹10

Можешь попробовать


ДЕпе

person Roberto De Pedrini    schedule 01.06.2013
comment
Я тоже не мог заставить это работать. Тоже выдало ошибку. - У меня всегда есть ссылка на страницы поддержки IBM для этого выпуска на случай, если это будет полезно для кого-то еще: publib.boulder.ibm.com/html/as400/v4r5/ic2924/index.htm - person TomEaton; 06.06.2013