2016-07-21 2 views
0

Мне было интересно, как Axapta переводит его операторов SQL и наткнулся на это: how-joins-in-x-select-statement-are-translated-into-t-sqlMicrosoft Dynamics AX SQL JOIN Перевод

Это первый пример, приведенный на сайте.

РЕГИСТРИРУЙТЕСЬ в X ++:

select AccountNum from custTable 
    join TaxGroupId from custGroup 
    where custGroup.CustGroup == custTable.CustGroup; 

CROSS JOIN в T-SQL:

SELECT T1.ACCOUNTNUM, T1.RECID, T2.TAXGROUPID, T2.RECID 
FROM CUSTTABLE T1 CROSS JOIN CUSTGROUP T2 
WHERE ((T1.PARTITION=?) AND (T1.DATAAREAID=?)) 
    AND (((T2.PARTITION=?) AND (T2.DATAAREAID=?)) 
    AND (T2.CUSTGROUP=T1.CUSTGROUP)) 

Я теперь интересно, что означает знак вопроса в этом заявлении. ? отмечен как ошибка из-за неправильного синтаксиса.

Что означает WHERE ((T1.PARTITION=?) AND (T1.DATAAREAID=?))?

ответ

1

Эти поля являются частью реализации Data Isolation в Dynamics AX. Более подробную информацию here

поле T1.PARTITION относится к Перегородки:

Перегородки делят и изолировать бизнес-данные установки с помощью специальной обработки, что AOS относится к запросам данных. Эта специальная обработка происходит непосредственно перед отправкой запросов в базовую базу данных Microsoft SQL Server, когда системное поле с именем Partition присутствует в запрошенной таблице.

поле T1.DATAAREAID относится к компании или юридическому лицу:

Каждый раздел содержит, по меньшей мере, одна компания или юридическое лицо. Юридическое лицо происходит только в одном разделе. Когда вы создаете юридический объект, система назначает его текущему разделу. Юридическое лицо никогда не может быть перемещено в другой раздел. Однако его данные могут быть экспортированы из раздела, а затем импортированы в другую компанию в другой раздел.

Вопросительный знак в конечном итоге заменяется фактическими значениями разделов и компаний в зависимости от контекста, из которого вызывается оператор.

+0

, что о таких областях, как TAXGROUPID или что-то подобное. Это не системное поле, но в последнем примере на странице он также используется с =? , Это потому, что он находится в подзапросе и тоже там заменен? – Bongo

+1

Это также местозаполнитель, который будет заменен на «Std» в этом примере. Таким образом, SQL-сервер получает параметризованный запрос (который показан в блоге) и значения параметров, которые будут варьироваться в зависимости от контекста. –

1

Вопросительные знаки являются заполнителями, позволяющими SQL-серверу вычислять планы выполнения для запросов, где значения поиска часто меняются.

Microsoft Dynamics AX может передавать любые параметры (заполнители) или литералов (фактических значений) в запросах.

• Параметры позволяют Microsoft Dynamics AX и серверу базы данных повторно использовать запрос при изменении значений поиска. Они являются предпочтительными для высокочастотных запросов .

• Литералы позволяют серверу базы данных оптимизировать запрос для конкретной информации. Это обеспечивает оптимальный запрос для этого информации, но сервер базы данных должен выполнить оптимизацию для каждого выполненного запроса. Литералы могут использоваться для длинных работающих запросов, таких как сложные объединения.

Разработчик может переопределить использование литералов по умолчанию, указав в своем коде параметры , или администратор может переопределить использование литералов в Утилите настройки сервера.