Параметры динамического запроса M в Power BI Desktop

В этой статье описывается создание и работа с динамическими параметрами запросов 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.

Создание и использование динамических параметров

В следующем примере одно значение передается в параметр динамически.

Добавление параметров

  1. В Power BI Desktop выберите Home>Transform data>Transform data, чтобы открыть Редактор Power Query.

  2. В Редактор Power Query выберите New Parameters в разделе Manage Parameters на ленте.

    Снимок экрана: меню ленты.

  3. В окне "Управление параметрами" заполните сведения о параметре. Дополнительные сведения см. в разделе "Создание параметра".

    Снимок экрана: сведения о параметрах.

  4. Нажмите кнопку "Создать" , чтобы добавить дополнительные параметры.

    Снимок экрана показывает «Новый», чтобы создать другой параметр.

  5. После добавления параметров нажмите кнопку "ОК".

Ссылка на параметры в запросе M

  1. После создания параметров их можно ссылаться на них в запросе M. Чтобы изменить запрос M, пока выбран запрос, откройте расширенный редактор.

    Screenshot, показывающий открытие Расширенный редактор.

  2. Обратитесь к параметрам в запросе M, как показано жёлтым цветом на следующем рисунке.

    Снимок экрана: ссылка на параметр.

    Подсказка

    Чтобы ссылаться на параметр в коде M, используйте его имя напрямую (например, CountryParameter). Для текстовых параметров можно объединить, как показано выше. Для даты или числовых параметров убедитесь, что тип данных соответствует.

    Пример T-SQL (один параметр)

    let
          Source = Sql.Database("server", "database", [Query="SELECT * FROM Sales WHERE Country = '" & CountryParameter & "'"])
    in
          Source
    
  3. После редактирования запроса нажмите кнопку "Готово".

Создание таблиц значений

Создайте таблицу для каждого параметра с столбцом, предоставляющим возможные значения, доступные для динамического задания на основе выбора фильтра. В этом примере необходимо StartTimeEndTime , чтобы параметры были динамическими. Так как для этих параметров требуется Date/Time параметр, вы создаете возможные входные данные для динамического задания даты для параметра.

  1. На ленте Power BI Desktop в разделе Modeling выберите таблицу New.

    Снимок экрана: выбор новой таблицы.

  2. Создайте таблицу для значений StartTime параметра, например:

    StartDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))

    Снимок экрана: первая таблица.

  3. Создайте вторую таблицу для значений EndTime параметра, например:

    EndDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))

    Снимок экрана: вторая таблица.

    Примечание.

    Используйте имя столбца, которое не находится в фактической таблице. Если вы используете то же имя, что и фактический столбец таблицы, выбранное значение применяется в качестве фильтра в запросе.

Привязка полей к параметрам

Теперь, когда вы создали таблицы с Date полями, можно привязать каждое поле к параметру. Привязка поля к параметру означает, что при изменении выбранного значения поля значение передается параметру и обновляет запрос, ссылающийся на параметр.

  1. Чтобы привязать поле, в представлении Model Power BI Desktop выберите только что созданное поле и в области Properties выберите Advanced.

    Примечание.

    Тип данных столбца должен соответствовать типу данных параметра M.

    Снимок экрана: привязка поля к параметру.

  2. Выберите раскрывающийся список в разделе "Привязка к параметру " и выберите параметр, который требуется привязать к полю:

    Снимок экрана: привязка параметра к полю.

    Так как этот пример предназначен для установки параметра на одно значение, оставьте Множественный выбор установленным в положение Нет, которое является значением по умолчанию:

    Снимок экрана, на котором показан параметр

    Если вы установили сопоставленный столбец на Нет для Multi-select, необходимо использовать режим одного выбора в срезе или требовать один выбор в карточке фильтра.

    Если в вариантах использования требуется передать несколько значений в один параметр, задайте для элемента управления значение "Да " и убедитесь, что запрос M настроен для принятия нескольких значений. Вот пример для RepoNameParameter, который позволяет использовать несколько значений.

    Снимок экрана: пример с несколькими значениями.

  3. Повторите эти действия, если у вас есть другие поля для привязки к другим параметрам.

    Снимок экрана: настройка дополнительных параметров.

Примечание.

Раскрывающийся список "Привязка к параметру" доступен только для поддерживаемых источников DirectQuery и определенных типов данных. Если этот параметр не отображается в представлении модели, убедитесь, что используется поддерживаемый источник и правильно создан параметр. Эта функция появилась в Power BI Desktop в июне 2022 года.

Теперь вы можете ссылаться на это поле в срезе или в качестве фильтра:

Снимок экрана, демонстрирующий ссылку на поля.

Включить выбор всех

В этом примере модель Power BI Desktop имеет поле с именем Country, которое является списком стран и регионов, привязанных к параметру M с именем countryNameMParameter. Этот параметр включен для нескольких выборов, но не включен для выбора всех. Чтобы использовать опцию Выбрать все в слайсере или карточке фильтра, выполните следующие шаги:

Снимок экрана: пример многоизбирающего параметра M.

Чтобы включить выбор всех для страны, выполните приведенные действия.

  1. В расширенных свойствах для страны включите переключатель Select all, который включает ввод всех значений. Измените значение "Выбрать все" или запишите значение по умолчанию.

    Снимок экрана, показывающий выбор функции «Выбрать всё» для M-параметра.

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

  2. Запустите Редактор Power Query, выберите запрос и выберите Расширенный редактор. Измените запрос M, чтобы использовать значение Выбрать все, чтобы ссылаться на опцию Выбрать все.

    Снимок экрана: запрос M.

  3. В Расширенный редактор Добавьте логическое выражение, которое оценивается как true, если параметр включен для Multi-select и содержит значение Select all value и в противном случае возвращает значение false:

    Снимок экрана: пример логического выражения для select all.

  4. Включите результат выражения Select all Boolean в исходный запрос. В примере имеется параметр типа Boolean в исходном запросе includeAllCountries, который установлен на результат логического выражения из предыдущего шага. Этот параметр можно использовать в предложении фильтра в запросе так, чтобы false применял логические фильтры к выбранным именам стран или регионов, а true фактически не применял никакой фильтр.

    Снимок экрана, который показывает булеву переменную

  5. После обновления запроса 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 см. в следующих ресурсах: