Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается создание и работа с динамическими параметрами запросов M в Power BI Desktop. С помощью параметров динамического запроса M авторы модели могут настроить значения фильтра или среза, которые средства просмотра отчетов могут использовать для параметра запроса M. Параметры динамического запроса M позволяют авторам модели более контролировать выбор фильтра для включения в исходные запросы DirectQuery.
Авторы модели понимают предназначенную семантику своих фильтров и часто знают, как создавать эффективные запросы к источнику данных. С помощью параметров динамического запроса M авторы моделей могут гарантировать, что выбор фильтров включается в исходные запросы в правильной точке, чтобы достичь предполагаемых результатов с оптимальной производительностью. Параметры динамического запроса M могут быть особенно полезны для оптимизации производительности запросов.
[! ПРИМЕЧАНИЕ] Примеры в этой статье используют Kusto и T-SQL для демонстрации параметров динамического запроса M. Основные понятия применяются к любому поддерживаемому источнику DirectQuery. При подключении к базам данных KQL Fabric (Real-Time Intelligence) используйте соединитель Azure Data Explorer (Kusto) — те же шаблоны применяются.
Посмотрите, как Sujata объясняет и использует параметры динамического запроса M в этом видео, а затем попробуйте их самостоятельно.
Примечание.
Это видео может использовать более ранние версии Power BI Desktop или служба Power BI.
Требуемые условия
Для работы с этими процедурами необходимо иметь допустимый запрос M, использующий одну или несколько таблиц DirectQuery.
Создание и использование динамических параметров
В следующем примере одно значение передается в параметр динамически.
Добавление параметров
В Power BI Desktop выберите Home>Transform data>Transform data, чтобы открыть Редактор Power Query.
В Редактор Power Query выберите New Parameters в разделе Manage Parameters на ленте.
В окне "Управление параметрами" заполните сведения о параметре. Дополнительные сведения см. в разделе "Создание параметра".
Нажмите кнопку "Создать" , чтобы добавить дополнительные параметры.
После добавления параметров нажмите кнопку "ОК".
Ссылка на параметры в запросе M
После создания параметров их можно ссылаться на них в запросе M. Чтобы изменить запрос M, пока выбран запрос, откройте расширенный редактор.
Обратитесь к параметрам в запросе M, как показано жёлтым цветом на следующем рисунке.
Подсказка
Чтобы ссылаться на параметр в коде M, используйте его имя напрямую (например,
CountryParameter). Для текстовых параметров можно объединить, как показано выше. Для даты или числовых параметров убедитесь, что тип данных соответствует.Пример T-SQL (один параметр)
let Source = Sql.Database("server", "database", [Query="SELECT * FROM Sales WHERE Country = '" & CountryParameter & "'"]) in SourceПосле редактирования запроса нажмите кнопку "Готово".
Создание таблиц значений
Создайте таблицу для каждого параметра с столбцом, предоставляющим возможные значения, доступные для динамического задания на основе выбора фильтра. В этом примере необходимо StartTimeEndTime , чтобы параметры были динамическими. Так как для этих параметров требуется Date/Time параметр, вы создаете возможные входные данные для динамического задания даты для параметра.
На ленте Power BI Desktop в разделе Modeling выберите таблицу New.
Создайте таблицу для значений
StartTimeпараметра, например:StartDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Создайте вторую таблицу для значений
EndTimeпараметра, например:EndDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Примечание.
Используйте имя столбца, которое не находится в фактической таблице. Если вы используете то же имя, что и фактический столбец таблицы, выбранное значение применяется в качестве фильтра в запросе.
Привязка полей к параметрам
Теперь, когда вы создали таблицы с Date полями, можно привязать каждое поле к параметру. Привязка поля к параметру означает, что при изменении выбранного значения поля значение передается параметру и обновляет запрос, ссылающийся на параметр.
Чтобы привязать поле, в представлении Model Power BI Desktop выберите только что созданное поле и в области Properties выберите Advanced.
Примечание.
Тип данных столбца должен соответствовать типу данных параметра M.
Выберите раскрывающийся список в разделе "Привязка к параметру " и выберите параметр, который требуется привязать к полю:
Так как этот пример предназначен для установки параметра на одно значение, оставьте Множественный выбор установленным в положение Нет, которое является значением по умолчанию:
Если вы установили сопоставленный столбец на Нет для Multi-select, необходимо использовать режим одного выбора в срезе или требовать один выбор в карточке фильтра.
Если в вариантах использования требуется передать несколько значений в один параметр, задайте для элемента управления значение "Да " и убедитесь, что запрос M настроен для принятия нескольких значений. Вот пример для
RepoNameParameter, который позволяет использовать несколько значений.Повторите эти действия, если у вас есть другие поля для привязки к другим параметрам.
Примечание.
Раскрывающийся список "Привязка к параметру" доступен только для поддерживаемых источников DirectQuery и определенных типов данных. Если этот параметр не отображается в представлении модели, убедитесь, что используется поддерживаемый источник и правильно создан параметр. Эта функция появилась в Power BI Desktop в июне 2022 года.
Теперь вы можете ссылаться на это поле в срезе или в качестве фильтра:
Включить выбор всех
В этом примере модель Power BI Desktop имеет поле с именем Country, которое является списком стран и регионов, привязанных к параметру M с именем countryNameMParameter. Этот параметр включен для нескольких выборов, но не включен для выбора всех. Чтобы использовать опцию Выбрать все в слайсере или карточке фильтра, выполните следующие шаги:
Чтобы включить выбор всех для страны, выполните приведенные действия.
В расширенных свойствах для страны включите переключатель Select all, который включает ввод всех значений. Измените значение "Выбрать все" или запишите значение по умолчанию.
Значение, выбранное как Выбрать все, передается параметру в виде списка, содержащего заданные вами значения. Поэтому при определении этого значения или использовании значения по умолчанию убедитесь, что значение уникально и не существует в поле, которое привязано к параметру.
Запустите Редактор Power Query, выберите запрос и выберите Расширенный редактор. Измените запрос M, чтобы использовать значение Выбрать все, чтобы ссылаться на опцию Выбрать все.
В Расширенный редактор Добавьте логическое выражение, которое оценивается как
true, если параметр включен для Multi-select и содержит значение Select all value и в противном случае возвращает значениеfalse:
Включите результат выражения Select all Boolean в исходный запрос. В примере имеется параметр типа Boolean в исходном запросе
includeAllCountries, который установлен на результат логического выражения из предыдущего шага. Этот параметр можно использовать в предложении фильтра в запросе так, чтобыfalseприменял логические фильтры к выбранным именам стран или регионов, аtrueфактически не применял никакой фильтр.
После обновления запроса M с учетом нового значения «Выбрать все» можно использовать функцию «Выбрать все» в фильтрах или срезах.
Для справки приведен полный запрос к предыдущему примеру:
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})
Рекомендации и ограничения
Примечание.
Для баз данных KQL Fabric и Azure Data Explorer отправьте логику агрегирования (make-series, summarize, series_decompose_anomalies) в источник, а не возвращая необработанные события в Power BI. Это особенно важно для данных временных рядов с большим объемом, а визуальные элементы используют предварительно агрегированные результаты, поддерживающие интерактивную производительность запросов.
При использовании динамических параметров запроса M следует учитывать некоторые рекомендации и ограничения.
- Один параметр не может быть привязан к нескольким полям или наоборот.
- Параметры динамического запроса M не поддерживают агрегации.
- Параметры динамического запроса M не поддерживают безопасность на уровне строк (RLS).
- Имена параметров не могут быть зарезервированными словами для Data Analysis Expressions (DAX) и не должны содержать пробелы. Вы можете добавить
Parameterв конец имени параметра, чтобы избежать этого ограничения. - Имена таблиц не могут содержать пробелы или специальные символы.
- Если параметр является типом
Date/Timeданных, необходимо привести его в запрос M какDateTime.Date(<YourDateParameter>). - Если вы используете источники SQL, при каждом изменении значения параметра может появиться диалоговое окно подтверждения. Это диалоговое окно связано с параметром безопасности: требуется утверждение пользователя для новых запросов собственной базы данных. Этот параметр можно найти и отключить в разделе Security раздела Power BI Desktop Options.
- Параметры динамического запроса M могут не работать при доступе к семантической модели в Excel.
- Параметры динамического запроса M не поддерживаются в Сервер отчетов Power BI.
- Переключение источников данных с помощью параметров динамического запроса M не поддерживается в служба Power BI. Дополнительные сведения см. в статье об обновлении и динамических источниках данных.
Неподдерживаемые типы параметров вне поля
- Любое
- Продолжительность
- Истина/Ложь
- Бинарный
Неподдерживаемые фильтры
- Относительный срез времени или фильтр
- Относительная дата
- Фильтр иерархии
- Фильтр по нескольким полям
- Исключение фильтров/Отсутствие фильтров
- Перекрестное выделение
- Фильтр детализации
- Перекрестный фильтр
- Верхний N-фильтр
Неподдерживаемые операции
- И
- Содержит
- Меньше
- Больше
- Начинается с
- Не начинается с
- Не является
- Не содержит
- Пустой
- Не является пустым
Связанный контент
Дополнительные сведения о возможностях Power BI Desktop см. в следующих ресурсах: