AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.11.2024, 12:40   #1  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
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=?))
В запросе ошибка в хинте по индексу WITH ( INDEX(i106966_I_106966PUBLICITYJOURNALRECIDX_(null)).
(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  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
- Ребут АОСа не помогает ? Те запросы работали, работали, а потом хоп и перестали работать и всегда падает на одной и той же строчке и так до тех пор пока не переименуешь индекс ?

- перед запросом с курсором никакие манипуляции не делаем ? те он просто объявлен, заполнен и потом запрос или все таки что-то есть ?

with означает явную подсказку какой индекс использовать, но в 2012 насколько я знаю такое по умолчанию отключено (есть недокументированная возможность активации, но официальной поддержки такой штуки нет), возможно для tempDB такое работает всегда при использовании инструкций, но как то не верится.

какая у вас версия 2012 ?

вместо null по идее должно быть имя экземпляра таблички, т.е. что то типа 106966_I_106966PUBLICITYJOURNALRECIDX_ACAE536E796A4D7783471D261AF32F8E - а поскольку null то каким то образом ссылка на экземпляр исчезает - запрос генерит ядро, поэтому скорее всего ошибка в нём.

а что с постоянным таблицами, как выглядит текст ошибки - дословно такой же? просто там название индекса всегда фиксированно и _ добавлять не надо в конце
__________________
Sergey Nefedov
Старый 20.11.2024, 14:16   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 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  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
При работе с временными таблицами TempDB рекомендуется сначала выполнить их инициализацию
Никогда про это не слышал (и не делал).
А какой это эффект дает? каких проблем помогает избежать?
Старый 20.11.2024, 14:56   #5  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
Цитата:
Сообщение от SRF Посмотреть сообщение
- Ребут АОСа не помогает ? Те запросы работали, работали, а потом хоп и перестали работать и всегда падает на одной и той же строчке и так до тех пор пока не переименуешь индекс ?
Ребут не помогает. Да, работали и вдруг стали падать на одной строчке, пока что-то не сделаешь с индексом.


Цитата:
Сообщение от SRF Посмотреть сообщение
- перед запросом с курсором никакие манипуляции не делаем ? те он просто объявлен, заполнен и потом запрос или все таки что-то есть ?
Заполнен скульной процедурой запросом вида "insert into [tempdb]..[%1] (%2 recversion, partition) %3", где %1 это RetailUtilities::getPhysicalTableName и 2% это поля для вставки. И %3 это вызов хранимой процедуры EXEC ..

Цитата:
Сообщение от SRF Посмотреть сообщение
with означает явную подсказку какой индекс использовать, но в 2012 насколько я знаю такое по умолчанию отключено (есть недокументированная возможность активации, но официальной поддержки такой штуки нет), возможно для tempDB такое работает всегда при использовании инструкций, но как то не верится.
Хинты выключены. Да и в самом запросе в аксапте, на котором падает выполнение их даже не прописано.

Цитата:
Сообщение от SRF Посмотреть сообщение
какая у вас версия 2012 ?
2012 R3 6.3.164.0

Цитата:
Сообщение от SRF Посмотреть сообщение
вместо null по идее должно быть имя экземпляра таблички, т.е. что то типа 106966_I_106966PUBLICITYJOURNALRECIDX_ACAE536E796A4D7783471D261AF32F8E - а поскольку null то каким то образом ссылка на экземпляр исчезает - запрос генерит ядро, поэтому скорее всего ошибка в нём.
Таблица на скуле после выполнения остается.

Цитата:
Сообщение от SRF Посмотреть сообщение
а что с постоянным таблицами, как выглядит текст ошибки - дословно такой же? просто там название индекса всегда фиксированно и _ добавлять не надо в конце
Точного текста сейчас нет, но смысл тот же, в скобках индекса null
Старый 20.11.2024, 14:59   #6  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
А сама таблица в базе TempDB на момент выполнения запроса существует?
Да, и после ее можно увидеть на скуле.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
При работе с временными таблицами TempDB рекомендуется сначала выполнить их инициализацию

X++:
   // Force instantiation of Temp DB table.
    select generateonly firstonly RecId from PublicityPriorTempDb;

Это делается в методе RetailUtilities::getPhysicalTableName(). Т.е. код такой получается

X++:
RetailUtilities::getPhysicalTableName(PublicityPriorTempDb);

// Далее код по наполнению временной таблицы
Делается.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
PS: Ну и добавление хинта в запросе - это настойки AOS. Лучше этого не делать. По умолчанию, в dax2012 они отключены.
Хинты выключены, и в самом запросе их нет.
Старый 20.11.2024, 17:53   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,939 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Gibrid Посмотреть сообщение
2012 R3 6.3.164.0
Странный номер
Посмотрите в свойствах для файла Ax32Serv.exe

Должно быть что-то более информативное, типа
6.3.6000.8144

если же все равно показывает 6.3.164.0 то это какая-то ерунда. Проверяйте свою инсталляцию. Возможно не все нормально установлено, обновлено.
Старый 20.11.2024, 18:50   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,939 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А, еще интересно какой уровень совместимости на SQL базе стоит.
Если выставить SQL2016 проблема пропадет или нет.
Старый 21.11.2024, 08:25   #9  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Окончание индекса ведь строится по реальному физическому имени таблицы в базе данных TempDB. Если таблицы нет, то какое имя добавлять?
Так а реальное физическое имя то уже есть - и для построения имени индекса у АОСа есть вся информация - он же в селекте то пишет имя экземпляра, к которому обращается - а то что существует этот экземпляр физически или нет на БД это уже другой вопрос - если его нет, то в момент выполнения просто будет ошибка что такой то объект не существует. (для меня не очень логично делать доп. запрос на определение существует ли экземпляр только при построении индекса, когда вся информация у нас и так есть и мы можем сами построить имя со стороны АОСа).

Сейчас немного смущают следующие моменты
- в примере в запросе один ID, а на скринах ID таблички другой - запрос с одной инсталляции, скрины AOT с другой ?

- в коде мы выбираем только одно поле, в запросе присутствуют все поля - хотя индексы не кластерные, кеширование отключено, интересно почему выбираются все поля, мб потому что tempDB.

- не помогает ребут, те это меняется что-то в каких-то постоянных характеристиках системы, а не кеш\память и т.д. - так а на всех ли инсталляциях проявляется проблема, на разных АОСах, в пакетном режиме ?

- что в EV на АОСе ? Там эта ошибка есть, другие ?

- если снять трассировки SQL запросов (например через TraceParser) в этом функционале после исправления проблемы и просто в других местах системы - все ли запросы уходят с with ? (опять таки если несколько АОСов то попробовать снять трассировки на разных)
__________________
Sergey Nefedov
Старый 21.11.2024, 09:31   #10  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
В свойствах файла 6.3.6000.151
Старый 21.11.2024, 09:36   #11  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
Цитата:
Сообщение от Logger Посмотреть сообщение
А, еще интересно какой уровень совместимости на SQL базе стоит.
Если выставить SQL2016 проблема пропадет или нет.
Стоит 12. Не могу проверить измениться ли что-то, т.к. прям сейчас проблемы нет - индекс уже обновили. Процессы критичные и ждать не могут.
Старый 21.11.2024, 09:50   #12  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
Цитата:
Сообщение от SRF Посмотреть сообщение
Сейчас немного смущают следующие моменты
- в примере в запросе один ID, а на скринах ID таблички другой - запрос с одной инсталляции, скрины AOT с другой ?
Да, ошибка с боевой базы, скрин с тестовой. Но там все идентично, за исключением ID.


Цитата:
Сообщение от SRF Посмотреть сообщение
- не помогает ребут, те это меняется что-то в каких-то постоянных характеристиках системы, а не кеш\память и т.д. - так а на всех ли инсталляциях проявляется проблема, на разных АОСах, в пакетном режиме ?
Вылезает проблема не так часто, раз в пол года может... Статистики еще не набралось. Единственное, в последний раз, когда появилась проблема ночью, чуть позже перезагрузился кластер со всеми аосами и скулем... После этого пакетник с этим запросом 1 раз отработал, а потом опять начал падать в ошибку.

Цитата:
Сообщение от SRF Посмотреть сообщение
- что в EV на АОСе ? Там эта ошибка есть, другие ?
Сразу не посмотрел, а сейчас почему-то не вижу на этом аосе события старше 1 дня. Не пойму почему.
Старый 21.11.2024, 10:08   #13  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
Цитата:
Сообщение от SRF Посмотреть сообщение
- если снять трассировки SQL запросов (например через TraceParser) в этом функционале после исправления проблемы и просто в других местах системы - все ли запросы уходят с with ? (опять таки если несколько АОСов то попробовать снять трассировки на разных)
В нашем установщике нет пункта TraceParser. Его как-то перевели не так? .NET Business Connector есть, который судя по всему рядом должен быть https://learn.microsoft.com/en-us/pr...e-trace-parser
Старый 21.11.2024, 10:19   #14  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,306 / 3540 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Он у Вас стоит - Средства разработки-Синтаксический анализатор журнала. Посмотрите в Program Files папки
Название: SNAG_Program-0171.png
Просмотров: 18

Размер: 10.8 Кб
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Gibrid (1).
Старый 21.11.2024, 10:55   #15  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
Цитата:
Сообщение от SRF Посмотреть сообщение
- если снять трассировки SQL запросов (например через TraceParser) в этом функционале после исправления проблемы и просто в других местах системы - все ли запросы уходят с with ? (опять таки если несколько АОСов то попробовать снять трассировки на разных)
Снял с того-же АОСа, где была ошибка. Запросы или без With, или с ним, но без дополнительных скобок.
К примеру:
X++:
SELECT TOP 1 T1.BATCHJOBCANCELED,
	T1.BATCHJOBENDED,
	T1.BATCHJOBERROR,
	T1.BATCHJOBID,
	T1.USERID,
	101090 
FROM BATCHJOBALERTS T1 WITH ( INDEX(I_2004BATCHJOBID)) 
WHERE ((BATCHJOBID=5639649525)
Старый 21.11.2024, 12:10   #16  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Gibrid Посмотреть сообщение
Вылезает проблема не так часто, раз в пол года может... Статистики еще не набралось. Единственное, в последний раз, когда появилась проблема ночью, чуть позже перезагрузился кластер со всеми аосами и скулем... После этого пакетник с этим запросом 1 раз отработал, а потом опять начал падать в ошибку.

Сразу не посмотрел, а сейчас почему-то не вижу на этом аосе события старше 1 дня. Не пойму почему.
- это к админам, скорее всего могли настроить так хранение логов.
- в логах (batchlog) работы пакетника можно глянуть на каких АОСах были падения - разные там или не разные, но так скорее для статистики

- попробуйте поснимать трейсы своего процесса и посмотреть запрос на котором падает, трейсы можно снимать через счетчики windows - https://www.microsoft.com/en-us/down....aspx?id=27549, т.е. можете прямо пакетные задачи посмотреть - настраивать надо будет на всех АОСах где может выполняться пакетное задание. посмотрите на разных аосах\окружениях одни и те же запросы, одинаковые ли хинты там.

- еще про with - часть запросов без with - а там есть хинт top 1, что то подозрение возникает о том, что with появляется, если в запросе есть firstOnly - попробуйте поменять ваш запрос на count() и посмотреть будет ли with в запросе (понятно что это как закат солнца вручную, но как костыль возможно подойдет)

- насколько я понимаю билды у вас не последние, как MS в этом случае рекомендует - обновите ядро

- а что вы делаете с постоянными табличками - там тоже название индекса меняете или делаете синхронизацию\пересоздание индекса? помогает ли просто пересоздание индекса ?
__________________
Sergey Nefedov
Старый 21.11.2024, 12:24   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,939 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Gibrid Посмотреть сообщение
В свойствах файла 6.3.6000.151
Судя по
https://www.microsoft.com/en-us/dyna...urce=axsupport

у вас голый CU13
не самый свежий билд, но детских багов там уже не должно бы быть.
Странно.
Старый 21.11.2024, 13:30   #18  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
Цитата:
Сообщение от SRF Посмотреть сообщение
- а что вы делаете с постоянными табличками - там тоже название индекса меняете или делаете синхронизацию\пересоздание индекса? помогает ли просто пересоздание индекса ?
Удаляю индекс. Создаю такой-же с другим именем.
Старый 21.11.2024, 13:32   #19  
Gibrid is offline
Gibrid
Участник
 
10 / 10 (1) +
Регистрация: 17.11.2021
Цитата:
Сообщение от SRF Посмотреть сообщение
- это к админам, скорее всего могли настроить так хранение логов.
- в логах (batchlog) работы пакетника можно глянуть на каких АОСах были падения - разные там или не разные, но так скорее для статистики

- попробуйте поснимать трейсы своего процесса и посмотреть запрос на котором падает, трейсы можно снимать через счетчики windows - https://www.microsoft.com/en-us/down....aspx?id=27549, т.е. можете прямо пакетные задачи посмотреть - настраивать надо будет на всех АОСах где может выполняться пакетное задание. посмотрите на разных аосах\окружениях одни и те же запросы, одинаковые ли хинты там.

- еще про with - часть запросов без with - а там есть хинт top 1, что то подозрение возникает о том, что with появляется, если в запросе есть firstOnly - попробуйте поменять ваш запрос на count() и посмотреть будет ли with в запросе (понятно что это как закат солнца вручную, но как костыль возможно подойдет)

- насколько я понимаю билды у вас не последние, как MS в этом случае рекомендует - обновите ядро
В общем жду повторения, собираю статистику...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axsa: MDM Adapter - Extending Dynamics AX 2012 R3 Master Data Management Blog bot DAX Blogs 0 22.05.2014 03:28
atinkerersnotebook: Walkthrough & Tutorial Summary Blog bot DAX Blogs 1 09.09.2013 09:11
DAX: How to gain additional value from the Microsoft application platform with Microsoft Dynamics AX 2012 R2 Blog bot DAX Blogs 3 21.06.2013 15:16
DAX: Official Dynamics AX 2012 R2 Content (update) - Where is it, and how can you find out about updates? Blog bot DAX Blogs 0 03.12.2012 11:11
Dynamics AX Sustained Engineering: Servicing of Dynamics AX 2012 and Dynamics AX 2012 Feature Pack Blog bot DAX Blogs 0 08.05.2012 23:12

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:30.