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 рекомендуется сначала выполнить их инициализацию
А какой это эффект дает? каких проблем помогает избежать? |
|
20.11.2024, 14:56 | #5 |
Участник
|
Цитата:
Цитата:
Цитата:
Сообщение от SRF
with означает явную подсказку какой индекс использовать, но в 2012 насколько я знаю такое по умолчанию отключено (есть недокументированная возможность активации, но официальной поддержки такой штуки нет), возможно для tempDB такое работает всегда при использовании инструкций, но как то не верится.
2012 R3 6.3.164.0 Цитата:
Точного текста сейчас нет, но смысл тот же, в скобках индекса null |
|
20.11.2024, 14:59 | #6 |
Участник
|
Цитата:
Цитата:
Сообщение от Владимир Максимов
При работе с временными таблицами TempDB рекомендуется сначала выполнить их инициализацию
X++: // Force instantiation of Temp DB table. select generateonly firstonly RecId from PublicityPriorTempDb; Это делается в методе RetailUtilities::getPhysicalTableName(). Т.е. код такой получается X++: RetailUtilities::getPhysicalTableName(PublicityPriorTempDb);
// Далее код по наполнению временной таблицы Хинты выключены, и в самом запросе их нет. |
|
|
|