Выберите N Row с DB2 в Visual Studio - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу получить первые 95 данных из DB2 в Visual Studio. Я использую адаптер таблицы, и у меня есть этот запрос,

SELECT * FROM ASEINDTA.TRX_BWS WHERE (DKLDATE = '2019-10-31') Извлечь только первые 95 строк

или это

ВЫБРАТЬ * ОТ ASEINDTA.TRX_BWS ГДЕ (DKLDATE = '2019-10-31') ЗАКАЗАТЬ ПО Col [1] ... Col [n] Выбрать только первые 95 строк

Но когда я нажимаю Query Builder, появляется эта ошибка. image error

Но когда я попробовал это в DBVisualizer, это работает. Как я могу получить эти данные? Помощь будет благодарна. Спасибо

Ответы [ 4 ]

0 голосов
/ 01 ноября 2019

Хорошо. Я внимательно посмотрел на ошибку изображения, которую вы разместили ...

запрос неверный. Это не совсем те же вопросы, которые вы разместили в своем вопросе.

. Внимательно посмотрите на ошибку изображения, и вы увидите, что слова Fetch и Rows заключены в двойные кавычки.

SELECT ... FROM WHERE (...) "Fetch" First 95 "Rows" Only 

Удалите из них двойные кавычки.

Если вы не пишете их так, значит, ваш инструмент «меняет» их, прежде чем отправлять их в движок db2. Опять же, не проблема с сервером db2.

С уважением

0 голосов
/ 01 ноября 2019

Удалите скобки из предложения where:

SELECT * FROM ASEINDTA.TRX_BWS WHERE DKLDATE = '2019-10-31' Fetch First 95 Rows Only
0 голосов
/ 01 ноября 2019

Кажется, проблема не в самом db2-сервере, а в инструменте, который вы используете для выполнения запросов. Вы сказали, что если вы запускаете то же самое в DBVisualizer, он работает правильно.

Просмотр документации по db2 для этой ошибки: sqlcode -104 sqlstate 42601

похоже, эта ошибка возвращается хранимой процедурой SYSPROC.ADMIN_CMD. Эта процедура предназначена для удаленного запуска команд администрирования db2 в целевой базе данных. Он не был предназначен для выполнения запросов ... так что парсер для этого процесса - это просто подмножество парсера db2, только для конкретных команд администратора. Так что он жалуется на токен FETCH из вашего запроса.

Кажется, что инструмент, который вы используете 'Я использую адаптер таблицы' (не знаю, что это такое), вызывает этот SYSPROC.ADMIN_CMD для выполнения запросов, но онвместо этого следует использовать обычный интерфейс CLI.

Я не знаю, какой именно инструмент вы используете. но попробуйте посмотреть, есть ли какие-то настройки, чтобы вы могли изменить это поведение.

Вот список административных команд, которые может выполнить процедура ADMIN_CMD: https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.rtn.doc/doc/r0012547.html.

, как вы можете видеть, инструкции SELECT там нет.

Если я пытаюсь выполнить простой SELECT, используя этот SP, я получаю ту же ошибку из окна CLP db2, прямо на сервере.

db2 "call SYSPROC.ADMIN_CMD('SELECT * FROM DEPARTMENT')"
SQL0104N  An unexpected token "SELECT" was found following
"BEGIN-OF-STATEMENT".  Expected tokens may include:  "ADD".  SQLSTATE=42601

С уважением, Сэмюэль Писарро

0 голосов
/ 01 ноября 2019

Один подход будет работать в DB2, и большинство других баз данных будет использовать ROW_NUMBER с подзапросом:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY some_col) rn
    FROM ASEINDTA.TRX_BWS
    WHERE DKLDATE = '2019-10-31'
)

SELECT *
FROM cte
WHERE rn <= 95;

Или встроенную версию, которая не использует CTE:

SELECT *
FROM
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY some_col) rn
    FROM ASEINDTA.TRX_BWS
    WHERE DKLDATE = '2019-10-31'
) t
WHERE rn <= 95;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...