20.11.2024, 12:40 | #1 |
Участник
|
Ax 2012 строит запрос с ошибкой в синтаксисе
Добрый день!
Сколько не искал, похожих проблем как-будто ни у кого не было. Время от времени аксапта делает до этого работавшие запросы неправильно - с ошибкой в синтаксисе. И получаем ошибку: Цитата:
Невозможно выбрать запись в Акции по приоритетам (PublicityPriorTempDb). Код акции: 0.
База данных SQL обнаружила ошибку. Описание ошибки SQL: [Microsoft][SQL Server Native Client 11.0][SQL Server]Неправильный синтаксис около конструкции "(". Оператор SQL: SELECT TOP 1 T1.PUBLICITYJOURNALRECID,T1.ITEMID,T1.PARTITION,101090 FROM tempdb."DBO".t106966_ACAE536E796A4D7783471D261AF32F8E T1 WITH ( INDEX(i106966_I_106966PUBLICITYJOURNALRECIDX_(null))) WHERE (((PARTITION=?) AND (DATAAREAID=?)) AND (PUBLICITYJOURNALRECID=?)) (null) - быть не должно. Сам запрос в аксапте выглядит так: X++: select firstOnly PublicityJournalRecId from PublicityPriorTempDb where PublicityPriorTempDb.PublicityJournalRecId == PublicityJournalTableCurrent.RecId https://ibb.co/vZtBQc1 И свойства таблицы: https://ibb.co/P5BX7Hj Ошибка исправляется, если удалить индекс. А потом создать другой с другим именем. Встречалась и на обычных таблицах, не TempDb. Подскажите, что это может быть? Баг в ядре? Куда вообще смотреть? Последний раз редактировалось Gibrid; 20.11.2024 в 12:46. |
|
20.11.2024, 13:32 | #2 |
Участник
|
- Ребут АОСа не помогает ? Те запросы работали, работали, а потом хоп и перестали работать и всегда падает на одной и той же строчке и так до тех пор пока не переименуешь индекс ?
- перед запросом с курсором никакие манипуляции не делаем ? те он просто объявлен, заполнен и потом запрос или все таки что-то есть ? with означает явную подсказку какой индекс использовать, но в 2012 насколько я знаю такое по умолчанию отключено (есть недокументированная возможность активации, но официальной поддержки такой штуки нет), возможно для tempDB такое работает всегда при использовании инструкций, но как то не верится. какая у вас версия 2012 ? вместо null по идее должно быть имя экземпляра таблички, т.е. что то типа 106966_I_106966PUBLICITYJOURNALRECIDX_ACAE536E796A4D7783471D261AF32F8E - а поскольку null то каким то образом ссылка на экземпляр исчезает - запрос генерит ядро, поэтому скорее всего ошибка в нём. а что с постоянным таблицами, как выглядит текст ошибки - дословно такой же? просто там название индекса всегда фиксированно и _ добавлять не надо в конце
__________________
Sergey Nefedov |
|
20.11.2024, 14:16 | #3 |
Участник
|
А сама таблица в базе TempDB на момент выполнения запроса существует? Окончание индекса ведь строится по реальному физическому имени таблицы в базе данных TempDB. Если таблицы нет, то какое имя добавлять?
При работе с временными таблицами TempDB рекомендуется сначала выполнить их инициализацию X++: // Force instantiation of Temp DB table. select generateonly firstonly RecId from PublicityPriorTempDb; Это делается в методе RetailUtilities::getPhysicalTableName(). Т.е. код такой получается X++: RetailUtilities::getPhysicalTableName(PublicityPriorTempDb);
// Далее код по наполнению временной таблицы PS: Ну и добавление хинта в запросе - это настойки AOS. Лучше этого не делать. По умолчанию, в dax2012 они отключены.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: Pandasama (3). |
20.11.2024, 14:42 | #4 |
Участник
|
Цитата:
При работе с временными таблицами TempDB рекомендуется сначала выполнить их инициализацию
А какой это эффект дает? каких проблем помогает избежать? |
|
|
|