SUBSTRING с предложением WHERE в MSDASQL вызывает ошибку
Я тестирую функцию в приложении Progress OpenEdge, которая загружает данные в таблицы БД. Многие из полей в таблице, которую я тестирую, ограничены нашим приложением 256-ю символами, поэтому я провожу некоторые крайние случаи, пытаясь загрузить записи, которые меньше, равны и больше 256 символов. После загрузки данных я запрашиваю базу данных и проверяю результаты. Я использую поставщика OLE DB для драйверов ODBC через программу тестирования TestComplete. Это запрос, который я использую:
SELECT SUBSTRING(lname, 1, 30)
FROM pub.referral
WHERE lname LIKE 'valid%'
Перед выполнением теста у драйвера ODBC нет проблем с этим запросом. Однако после его запуска в этой таблице есть поля, содержащие 256 символов, и у драйвера ODBC возникли проблемы с данными этой длины. Я думал, чтобы избежать этого с помощью SUBSTRING
, но я все еще получаю ошибку проверки при попытке использовать этот запрос:
The specified query is invalid. Database engine reports: [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Error in row
Познавательный! Эту ошибку я обычно вижу, когда в таблице больше данных, чем нравится ODBC. Странно, однако, если я достану WHERE
предложение проверяет и возвращает данные в виде 30-символьных блоков, как я указал в SUBSTRING
,
Это происходит из-за того, что у меня больше символов, чем драйвер ODBC ожидает в поле, или из-за чего-то еще, связанного с WHERE
предложение (неправильный синтаксис и т. д.?) Как я могу обойти это? Я хотел бы сделать это без изменения настроек через dbtool - для меня важно иметь конкретные настройки, которые есть в моей БД, чтобы мои тесты были точными.
1 ответ
Я подозреваю, что движок читает несоответствующие записи, чтобы увидеть, соответствуют ли они условию WHERE. Если несоответствующие записи имеют поля длиннее, чем их параметр SQL-WIDTH / MAX-WIDTH, это может дать результат, который вы видите.
Выполнение поиска без использования предложения WHERE означает, что каждая запись является частью набора результатов и будет обработана командой SUBSTRING() перед выводом.
Чтобы проверить это, нужно выполнить WHERE с совпадением равенства - движок должен только читать записи, которые соответствуют спецификации WHERE, выполнять SUBSTRING() и работать как положено.
С точки зрения "обойти" это - либо укоротите данные, либо увеличьте значение SQL-WIDTH или MAX-WIDTH для этих полей.
Вот КБ по теме: http://knowledgebase.progress.com/articles/Article/P162121
Вот КБ по работе со "слишком большими" столбцами: http://knowledgebase.progress.com/articles/Article/P126779?q=SQL%3A+Data+truncated+and+Invalid+long+datatype+and+error&l=en_US&type=Article__kav&fs=Search&pn=1