Параметры динамического запроса M в Power BI Desktop
В этой статье описывается создание и работа с динамическими параметрами запросов M в Power BI Desktop. С помощью параметров динамического запроса M авторы модели могут настроить значения фильтра или среза, которые средства просмотра отчетов могут использовать для параметра запроса M. Параметры динамического запроса M позволяют авторам модели более контролировать выбор фильтра для включения в исходные запросы DirectQuery.
Авторы модели понимают предназначенную семантику своих фильтров и часто знают, как создавать эффективные запросы к источнику данных. С помощью параметров динамического запроса M авторы моделей могут гарантировать, что выбор фильтров включается в исходные запросы в правильной точке, чтобы достичь предполагаемых результатов с оптимальной производительностью. Параметры динамического запроса M могут быть особенно полезны для оптимизации производительности запросов.
Посмотрите, как Sujata объясните и используйте параметры динамического запроса M в следующем видео, а затем попробуйте их самостоятельно.
Примечание.
Это видео может использовать более ранние версии Power BI Desktop или служба Power BI.
Необходимые компоненты
Для работы с этими процедурами необходимо иметь допустимый запрос M, использующий одну или несколько таблиц DirectQuery.
Создание и использование динамических параметров
В следующем примере одно значение передается в параметр динамически.
Добавление параметров
В Power BI Desktop выберите "Преобразование данных>дома>", чтобы открыть Редактор Power Query.
В Редактор Power Query выберите "Новые параметры" в разделе "Управление параметрами" на ленте.
В окне "Управление параметрами" заполните сведения о параметре. Дополнительные сведения см. в разделе "Создание параметра".
Нажмите кнопку "Создать" , чтобы добавить дополнительные параметры.
После добавления параметров нажмите кнопку "ОК".
Ссылка на параметры в запросе M
После создания параметров их можно ссылаться на них в запросе M. Чтобы изменить запрос M, пока выбран запрос, откройте Расширенный редактор.
Ссылка на параметры в запросе M, как выделено желтым цветом на следующем рисунке:
После редактирования запроса нажмите кнопку "Готово".
Создание таблиц значений
Создайте таблицу для каждого параметра с столбцом, предоставляющим возможные значения, доступные для динамического задания на основе выбора фильтра. В этом примере необходимо StartTime
EndTime
, чтобы параметры были динамическими. Так как для этих параметров требуется Date/Time
параметр, вы создаете возможные входные данные для динамического задания даты для параметра.
На ленте Power BI Desktop в разделе "Моделирование" выберите "Создать таблицу".
Создайте таблицу для значений
StartTime
параметра, например:StartDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Создайте вторую таблицу для значений
EndTime
параметра, например:EndDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Примечание.
Используйте имя столбца, которое не находится в фактической таблице. Если вы используете то же имя, что и фактический столбец таблицы, выбранное значение применяется в качестве фильтра в запросе.
Привязка полей к параметрам
Теперь, когда вы создали таблицы с Date
полями, можно привязать каждое поле к параметру. Привязка поля к параметру означает, что при изменении выбранного значения поля значение передается параметру и обновляет запрос, ссылающийся на параметр.
Чтобы привязать поле, в представлении модели Power BI Desktop выберите только что созданное поле и в области "Свойства" нажмите кнопку "Дополнительно".
Примечание.
Тип данных столбца должен соответствовать типу данных параметра M.
Выберите раскрывающийся список в разделе "Привязка к параметру " и выберите параметр, который требуется привязать к полю:
Так как этот пример предназначен для установки параметра на одно значение, сохраните значение "Несколько выборок " значение "Нет", которое является значением по умолчанию:
Если вы установили сопоставленный столбец no for Multi-select, необходимо использовать один режим выбора в срезе или один выбор в карточке фильтра.
Если в вариантах использования требуется передать несколько значений в один параметр, задайте для элемента управления значение "Да " и убедитесь, что запрос M настроен для принятия нескольких значений. Ниже приведен пример
RepoNameParameter
для нескольких значений:Повторите эти действия, если у вас есть другие поля для привязки к другим параметрам.
Теперь вы можете ссылаться на это поле в срезе или в качестве фильтра:
Включение выбора всех
В этом примере модель Power BI Desktop имеет поле " Страна", которое является списком стран и регионов, привязанных к параметру M с именем countryNameMParameter. Этот параметр включен для нескольких выборов, но не включен для выбора всех. Чтобы использовать параметр Select all в срезе или карточке фильтра, сделайте следующее:
Чтобы включить выбор всех для страны, выполните приведенные действия.
В расширенных свойствах для страны включите переключатель Select all, который включает ввод всех значений. Измените значение "Выбрать все" или запишите значение по умолчанию.
Выбор всего значения передается параметру в виде списка, содержащего определенное значение. Поэтому при определении этого значения или использовании значения по умолчанию убедитесь, что значение уникально и не существует в поле, которое привязано к параметру.
Запустите Редактор Power Query, выберите запрос и выберите Расширенный редактор. Измените запрос M, чтобы использовать значение Select all, чтобы ссылаться на параметр Select all .
В Расширенный редактор добавьте логическое выражение, которое оценивает
true
, включен ли параметр для multi-select и содержит значение Select all, а в противном случае возвращает:false
Включите результат выражения Select all Boolean в исходный запрос. В примере имеется логический параметр запроса в исходном
includeAllCountries
запросе, который имеет значение результата логического выражения из предыдущего шага. Этот параметр можно использовать в предложении фильтра в запросе, таким образом, чтобыfalse
для логических фильтров к выбранным странам или регионамtrue
не применялись никакие фильтры.После обновления запроса M для учетной записи нового значения Select all, можно использовать функцию Select all в срезах или фильтрах.
Для справки приведен полный запрос к предыдущему примеру:
let
selectedcountryNames = if Type.Is(Value.Type(countryNameMParameter), List.Type) then
Text.Combine({"'", Text.Combine(countryNameMParameter, "','") , "'"})
else
Text.Combine({"'" , countryNameMParameter , "'"}),
selectAllCountries = if Type.Is(Value.Type(countryNameMParameter), List.Type) then
List.Contains(countryNameMParameter, "__SelectAll__")
else
false,
KustoParametersDeclareQuery = Text.Combine({"declare query_parameters(",
"startTimep:datetime = datetime(", DateTime.ToText(StartTimeMParameter, "yyyy-MM-dd hh:mm"), "), " ,
"endTimep:datetime = datetime(", DateTime.ToText(EndTimeMParameter, "yyyy-MM-dd hh:mm:ss"), "), ",
"includeAllCountries: bool = ", Logical.ToText(selectAllCountries) ,",",
"countryNames: dynamic = dynamic([", selectedcountryNames, "]));" }),
ActualQueryWithKustoParameters =
"Covid19
| where includeAllCountries or Country in(countryNames)
| where Timestamp > startTimep and Timestamp < endTimep
| summarize sum(Confirmed) by Country, bin(Timestamp, 30d)",
finalQuery = Text.Combine({KustoParametersDeclareQuery, ActualQueryWithKustoParameters}),
Source = AzureDataExplorer.Contents("help", "samples", finalQuery, [MaxRows=null, MaxSize=null, NoTruncate=null, AdditionalSetStatements=null]),
#"Renamed Columns" = Table.RenameColumns(Source,{{"Timestamp", "Date"}, {"sum_Confirmed", "Confirmed Cases"}})
in
#"Renamed Columns"
Потенциальная угроза безопасности
Читатели отчетов, которые могут динамически задавать значения для параметров запроса M, могут получить доступ к дополнительным данным или активировать изменения в исходной системе с помощью атак внедрения. Эта возможность зависит от того, как ссылаться на параметры в запросе M и какие значения передаются в параметры.
Например, у вас есть параметризованный запрос Kusto, созданный следующим образом:
Products
| where Category == [Parameter inserted here] & HasReleased == 'True'
| project ReleaseDate, Name, Category, Region
Нет проблем с понятным пользователем, который передает соответствующее значение для параметра, например: Games
| where Category == 'Games' & HasReleased == 'True'
Однако злоумышленник может передать значение, которое изменяет запрос для получения доступа к дополнительным данным, например 'Games'//
:
Products
| where Category == 'Games'// & HasReleased == 'True'
| project ReleaseDate, Name, Category, Region
В этом примере злоумышленник может получить доступ к сведениям о играх, которые еще не выпущены, изменив часть запроса в комментарий.
Устранение риска
Чтобы снизить риск безопасности, избегайте объединения строк значений параметров M в запросе. Вместо этого используйте эти значения параметров в операциях M, которые сворачиваться в исходный запрос, чтобы модуль M и соединитель создавали окончательный запрос.
Если источник данных поддерживает импорт хранимых процедур, попробуйте сохранить логику запроса там и вызвать ее в запросе M. Кроме того, при наличии используйте механизм передачи параметров, встроенный в язык и соединители исходного запроса. Например, Azure Data Explorer имеет встроенные возможности параметров запроса, предназначенные для защиты от атак на внедрение.
Ниже приведены некоторые примеры этих мер по устранению рисков:
Пример использования операций фильтрации запроса M:
Table.SelectRows(Source, (r) => r[Columns] = Parameter)
Пример, объявляющий параметр в исходном запросе, или передает значение параметра в качестве входных данных функции исходного запроса:
declare query_parameters (Name of Parameter : Type of Parameter);
Пример прямого вызова хранимой процедуры:
let CustomerByProductFn = AzureDataExplorer.Contents("Help", "ContosoSales"){[Name="CustomerByProduct"]}[Data] in CustomerByProductFn({1, 3, 5})
Рекомендации и ограничения
При использовании динамических параметров запроса M следует учитывать некоторые рекомендации и ограничения.
- Один параметр не может быть привязан к нескольким полям или наоборот.
- Параметры динамического запроса M не поддерживают агрегаты.
- Параметры динамического запроса M не поддерживают безопасность на уровне строк (RLS).
- Имена параметров не могут быть зарезервированными словами анализа данных (DAX) и не содержат пробелы. Вы можете добавить
Parameter
в конец имени параметра, чтобы избежать этого ограничения. - Имена таблиц не могут содержать пробелы или специальные символы.
- Если параметр является типом
Date/Time
данных, необходимо привести его в запрос M какDateTime.Date(<YourDateParameter>)
. - Если вы используете источники SQL, при каждом изменении значения параметра может появиться диалоговое окно подтверждения. Это диалоговое окно связано с параметром безопасности: требуется утверждение пользователя для новых запросов собственной базы данных. Этот параметр можно найти и отключить в разделе "Безопасность" параметров Power BI Desktop.
- Параметры динамического запроса M могут не работать при доступе к семантической модели в Excel.
- Параметры динамического запроса M не поддерживаются в Сервер отчетов Power BI.
- Переключение источников данных с помощью параметров динамического запроса M не поддерживается в служба Power BI. Дополнительные сведения см. в статье об обновлении и динамических источниках данных.
Неподдерживаемые типы параметров вне поля
- Любое
- Duration
- True/False
- Binary
Неподдерживаемые фильтры
- Относительный срез времени или фильтр
- Относительная дата
- Срез иерархии
- Многофилдовый фильтр включает фильтр
- Исключение фильтров/ не фильтров
- Перекрестная выделение
- Фильтр детализации
- Перекрестный фильтр детализации
- Верхний N-фильтр
Неподдерживаемые операции
- And
- Содержит
- Меньше
- Больше
- Начинается с
- Не начинается с
- Нет
- Не содержит
- Пустой
- Не является пустым
Связанный контент
Дополнительные сведения о возможностях Power BI Desktop см. в следующих ресурсах: