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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.12.2021, 15:58   #1  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Query::Insert_recordset() - выборка из временной таблицы
Всем добрый день!

Спрашиваю так как сам решения не нахожу.

Можно ли использовать Query::Insert_recordset() для выборки данных из временной таблицы для вставки их в обычную? Yе нахожу куда в таком случае передаётся курсор временной таблицы, из которой делат ьвыборку.

Заранее спасибо!

UPD: Исходная задача смочь запустить следующий запрос:
X++:
            insert_recordset referenceTable (mainTableReferenceField, anotherTableReferenceField)
            select RecId, RefRecId
                from selectedRecords
            notexists join referenceTable
                where referenceTable.(mainTableReferenceField) == callerBaseRecord.RecId
                   && referenceTable.(anotherTableReferenceField) == selectedRecords.RefRecId;
где
mainTableReferenceField и anotherTableReferenceField - известные id полей (переменные типа FieldId) таблицы referenceTable
selectedRecords - временная таблица

Последний раз редактировалось Cardagant; 02.12.2021 в 16:10.
Старый 02.12.2021, 21:22   #2  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Всем добрый день!

Спрашиваю так как сам решения не нахожу.

Можно ли использовать Query::Insert_recordset() для выборки данных из временной таблицы для вставки их в обычную? Yе нахожу куда в таком случае передаётся курсор временной таблицы, из которой делат ьвыборку.

Заранее спасибо!

UPD: Исходная задача смочь запустить следующий запрос:
X++:
            insert_recordset referenceTable (mainTableReferenceField, anotherTableReferenceField)
            select RecId, RefRecId
                from selectedRecords
            notexists join referenceTable
                where referenceTable.(mainTableReferenceField) == callerBaseRecord.RecId
                   && referenceTable.(anotherTableReferenceField) == selectedRecords.RefRecId;
где
mainTableReferenceField и anotherTableReferenceField - известные id полей (переменные типа FieldId) таблицы referenceTable
selectedRecords - временная таблица
Я бы избегал использовать insert_recordset, а также join c временными таблицами, если только не стоит отдельной задачи оптимизации.

У меня к примеру RecId в InMemory таблице в версии 10.0.16 в какой-то момент какая-то корова просто слизывает. Было к примеру 7456, а потом 0.
Все значения пользовательских полей при этом есть. Никаких buf2buf нет.
Даже разбираться нет смысла, просто полагаюсь на свое поле myRecId которое берет значение от RecId после insert.

Клиент не MS будет клеймить, а вас, если в очередной бинарной версии они что-нибудь учудят. А они могут. Там же оптимизировать и оптимизировать
Старый 03.12.2021, 14:34   #3  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Так с InMemory временными таблицами (а до DAX2012 просто с временными таблицами) никакой оптимизации и не будет в массовых обработчиках. Только может быть более лаконичный синтаксис, а обработка всё равно будет по каждой записи.
Скорее всего так и есть. InMemory это всего лишь структура в памяти. Но если под insert_recordset мы понимаем "on a single server trip", то потенциально, если захотят, они могут эту одиночную передачу и с временными таблицами реализовать. Вставка идет в SQL таблицу, данные из памяти.
Старый 03.12.2021, 15:19   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
TempDB-таблицы себя замечательно ведут и замечательно джойнятся. А уж тот факт, что RecId там является счетчиком, который управляется СУБД - вообще достойно уважения. Так что джойны с TempDB-шными таблицами очень даже хороши. Особенно, когда нужно отфильтровать по списку RecId (RecordReferenceList тоже работает - но его потом нужно чистить)
Если мы берем как ответ что вместо InMemory таблицы в insert_recordset можно использовать TempDB-таблицу и это будет замечательно, то пусть это будет как одно из мнений.

Когда в Live/Prod значимого клиента что-то будет отваливаться, примерзать и прочее (а доверия к TempDB никакого) и в процесс нелегкого расследования виноват будет мой код/решение, то отсылки к тому что "это все Microsoft" не будут работать для программистов с больше чем 10 летним опытом именно в этой системе.

Для новичка - может быть, но опыт он как раз про знание проблемных мест и осторожность.
Старый 03.12.2021, 16:01   #5  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от ax_mct Посмотреть сообщение

Когда в Live/Prod значимого клиента что-то будет отваливаться, примерзать и прочее (а доверия к TempDB никакого) и в процесс нелегкого расследования виноват будет мой код/решение, то отсылки к тому что "это все Microsoft" не будут работать для программистов с больше чем 10 летним опытом именно в этой системе.

Для новичка - может быть, но опыт он как раз про знание проблемных мест и осторожность.
Единственная реальная проблема с временными таблицами tempDB(а на самом деле - это ОБЫЧНЫЕ таблицы, просто система их автоматически удаляет) - это возможность засорить sql statement cache. То есть - если у тебя в D365FO стоит такой вот примерно код:
for(i=0;i<10000;i++)
{
myFavoritetempDbTable myTable;
//do something with the table
}
то велика вероятность того, что система создаст 10000 одинаковых временных таблиц с разными именами, потом отправит 10000 разных запросов на вставку и выборку и тп. В результате кэш сиквела затрешиться.
Но от такого антипаттерна легко защититься, добавив еще одно поле для хранения i во временную таблицу, создать только один экземпляр этой временной таблицы и просто во все запросы добавить условие myTable.fieldI == i

А InMemory временные таблицы изначально были достаточно бесполезной штукой. Запросы с их участием обрабатывались на AOS (То есть - из запроса исключалась временная таблица, остатки запроса отправлялись на SQL, оттуда приходил результат - зачастую сотни мегабайт, результат записывался куда-то на AOSовский диск и потом это все медленно и печально джойнилось с inMemory table где-то на дисках AOS). Если просто быстродействия хочется (без необходимости джойнить временную таблицу куда-то), то лучше Map или там List использовать, потому что они в памяти остаются, а не высвопляются на диск AOS если в таблице больше нескольких сотен записей образовалось.
Старый 03.12.2021, 07:34   #6  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Cardagant Посмотреть сообщение
...Yе нахожу куда в таком случае передаётся курсор временной таблицы, из которой делат ьвыборку.
Я в свое время решения не нашел.
Правда мне нужно было выбирать не из временной таблицы, а из очень даже постоянной, но подготовив курсор (отключить проверку чтения АОС - партнеры зачем-то перекрыли чтение).
Если бы передавался QueryRun, то не было бы проблем. А вот в Query никакой курсор не передашь.
Старый 03.12.2021, 19:33   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Обсуждение особенностей работы с TempDB-таблицами вынес в отдельную ветку Работа с TempDB-таблицами
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: ax_mct (3).
Теги
query, recordset, tempdb

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
заполнение Excel файла данными из временной таблицы dark_knight DAX: Программирование 2 27.05.2020 00:13
insert_recordset со значением по умолчанию IvanS DAX: Программирование 2 29.01.2014 00:15
Display метод временной таблицы выполняется в компании DAT S.Kuskov DAX: Программирование 4 15.04.2011 20:11
Осторожно insert_recordset MikeR DAX: Программирование 11 28.04.2009 17:27
Advanced query range value expressions: поле таблицы - имя вcтроенной функции year(). ATimTim DAX: Программирование 12 27.03.2009 18:16

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

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

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