Teilen über


Dynamische M-Abfrageparameter in Power BI Desktop

In diesem Artikel wird das Erstellen und Arbeiten mit dynamischen M-Abfrageparametern in Power BI Desktop beschrieben. Mit dynamischen M-Abfrageparametern können Modellautoren die Filter- oder Slicerwerte konfigurieren, die Berichts-Viewer für einen M-Abfrageparameter verwenden können. Mit dynamischen M-Abfrageparametern haben Modellautoren mehr Kontrolle darüber, wie ausgewählte Filter in Abfragen der DirectQuery-Quelle integriert werden.

Modellautoren verstehen die beabsichtigte Semantik ihrer Filter und wissen oft, wie effiziente Abfragen für ihre Datenquelle geschrieben werden. Mit dynamischen M-Abfrageparametern können Modellautoren sicherstellen, dass Filterauswahlen am richtigen Punkt in Quellabfragen integriert werden, um die gewünschten Ergebnisse mit optimaler Leistung zu erzielen. Dynamische M-Abfrageparameter können besonders nützlich für die Optimierung der Abfrageleistung sein.

Sehen Sie sich an, wie Sujata dynamische M-Abfrageparameter im folgenden Video erklärt und verwendet, und testen Sie sie dann selbst.

Hinweis

In diesem Video werden möglicherweise frühere Versionen von Power BI Desktop oder des Power BI-Diensts verwendet.

Voraussetzungen

Um diese Prozeduren zu bearbeiten, benötigen Sie eine gültige M-Abfrage , die mindestens eine DirectQuery-Tabelle verwendet.

Erstellen und Verwenden dynamischer Parameter

Im folgenden Beispiel wird ein einzelner Wert dynamisch an einen Parameter übergeben.

Hinzufügen von Parametern

  1. Wählen Sie in Power BI Desktop die Option Start>Daten transformieren>Daten transformieren aus, um den Power Query-Editor zu öffnen.

  2. Wählen Sie im Power Query-Editor im Menüband unter Parameter verwalten die Option Neue Parameter aus.

    Screenshot that shows the Ribbon menu.

  3. Geben Sie im Fenster Parameter verwalten die Informationen zum Parameter ein. Weitere Informationen finden Sie unter Erstellen eines Parameters.

    Screenshot that shows parameter information.

  4. Wählen Sie Neu aus, um weitere Parameter hinzuzufügen.

    Screenshot that shows New to create another parameter.

  5. Wenn Sie mit dem Hinzufügen der Parameter fertig sind, wählen SieOK.

Verweisen auf die Parameter in der M-Abfrage

  1. Nachdem Sie die Parameter erstellt haben, können Sie in der M-Abfrage darauf verweisen. Um die M-Abfrage zu ändern, öffnen Sie den erweiterten Editor, während Sie die Abfrage ausgewählt haben.

    Screenshot that shows opening the Advanced Editor.

  2. Verweisen Sie anschließend in der M-Abfrage auf die Parameter, die in der folgenden Abbildung gelb hervorgehoben sind.

    Screenshot that shows referencing the parameter.

  3. Wenn Sie mit der Bearbeitung der Abfrage fertig sind, wählen Sie Fertig aus.

Erstellen von Wertetabellen

Erstellen Sie eine Tabelle für jeden Parameter mit einer Spalte, die die möglichen Werte bereitstellt, die basierend auf der Filterauswahl dynamisch festgelegt werden können. In diesem Beispiel sollen die StartTime Parameter und EndTime dynamisch sein. Da diese Parameter einen Date/Time Parameter erfordern, generieren Sie die möglichen Eingaben, um das Datum für den Parameter dynamisch festzulegen.

  1. Wählen Sie im Menüband Power BI Desktop unter Modellierungdie Option Neue Tabelle aus.

    Screenshot that shows selecting New table.

  2. Erstellen Sie eine Tabelle für die Werte des StartTime Parameters, z. B.:

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

    Screenshot that shows the first table.

  3. Erstellen Sie eine zweite Tabelle für die Werte des EndTime Parameters, z. B.:

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

    Screenshot that shows the second table.

    Hinweis

    Verwenden Sie einen Spaltennamen, der sich nicht in einer tatsächlichen Tabelle befindet. Wenn Sie denselben Namen wie eine tatsächliche Tabellenspalte verwenden, gilt der ausgewählte Wert als Filter in der Abfrage.

Binden der Felder an die Parameter

Nachdem die Tabellen mit dem Feld Date erstellt wurden, können die einzelnen Felder an einen Parameter gebunden werden. Das Binden eines Felds an einen Parameter bedeutet, dass der Wert beim Ändern des ausgewählten Feldwerts an den Parameter übergeben wird und die Abfrage aktualisiert wird, die auf den Parameter verweist.

  1. Um ein Feld zu binden, wählen Sie in der Ansicht Power BI Desktop Modell das neu erstellte Feld aus, und wählen Sie im Bereich Eigenschaften die Option Erweitert aus.

    Hinweis

    Der Spaltendatentyp sollte mit dem M-Parameterdatentyp übereinstimmen.

    Screenshot that shows binding the field to a parameter.

  2. Wählen Sie die Dropdownliste unter An Parameter binden und dann den Parameter aus, der an das Feld gebunden werden soll:

    Screenshot that shows binding the parameter to the field.

    Da es sich in diesem Beispiel um die Einstellung des Parameters auf einen einzigen Wert handelt, lassen Sie die Mehrfachauswahl auf Nein eingestellt, was die Standardeinstellung ist:

    Screenshot that shows multi-select set to No.

    Wenn die zugeordnete Spalte unter Mehrfachauswahl auf Nein festgelegt ist, müssen Sie entweder einen Einfachauswahlmodus im Slicer verwenden oder die Einfachauswahl in der Filterkarte festlegen.

    Wenn Ihre Anwendungsfälle mehrere Werte an einen einzelnen Parameter übergeben müssen, legen Sie das Steuerelement auf Ja fest, und stellen Sie sicher, dass Ihre M-Abfrage so eingerichtet ist, dass mehrere Werte akzeptiert werden. Es folgt ein Beispiel für RepoNameParameter, bei dem mehrere Werte zulässig sind:

    Screenshot that shows a multivalue example.

  3. Sie können diese Schritte wiederholen, wenn Sie andere Felder an andere Parameter binden möchten:

    Screenshot that shows configuring more parameters.

Schließlich können Sie das Feld in einem Slicer oder als Filter referenzieren:

Screenshot that shows referencing the fields.

Aktivieren von „Alle auswählen“

In diesem Beispiel verfügt das Power BI Desktop-Modell über ein Feld mit dem Namen Country, bei dem es sich um eine Liste von Ländern/Regionen handelt, die an einen M-Parameter namens countryNameMParameter gebunden sind. Dieser Parameter ist für die Option Mehrfachauswahl aktiviert, nicht jedoch für die Option Alle auswählen. Führen Sie die folgenden hinzugefügten Schritte aus, um die Option Alle auswählen in einem Datenschnitt oder einer Filterkarte verwenden zu können:

Screenshot that shows an example of a multiselect M parameter.

So aktivieren Sie Alle auswählen für Land:

  1. Aktivieren Sie in den Erweiterten Eigenschaften für Land die Umschaltfläche Alle auswählen , wodurch die Eingabe Alle Wert auswählen aktiviert wird. Bearbeiten Sie den Wert Alle auswählen, oder notieren Sie sich den Standardwert.

    Screenshot that shows Select all for an M parameter.

    Der Select All-Wert wird an den Parameter als Liste übergeben, die den von Ihnen definierten Wert enthält. Wenn Sie also diesen Wert definieren oder den Standardwert verwenden, stellen Sie sicher, dass der Wert eindeutig ist und nicht in dem Feld existiert, das an den Parameter gebunden ist.

  2. Starten Sie die Power Query-Editor, wählen Sie die Abfrage aus, und wählen Sie dann Erweiterter Editor aus. Bearbeiten Sie die M-Abfrage so, dass der Wert Alles auswählen auf die Option Alles auswählen verweist.

    Screenshot that shows an M query.

  3. Fügen Sie im Erweiterten Editor einen booleschen Ausdruck hinzu, trueder als TRUE ausgewertet wird, wenn der Parameter für Mehrfachauswahl aktiviert ist und den Select All-Wert enthält (andernfalls wird FALSE zurückgegeben).false

    Screenshot that shows an example Boolean expression for Select all.

  4. Anschließend müssen Sie das Ergebnis des booleschen Ausdrucks für Alle auswählen in die Quellabfrage integrieren. In diesem Beispiel ist der boolesche Abfrageparameter in der Quellabfrage mit dem NamenincludeAllCountries auf das Ergebnis des booleschen Ausdrucks aus dem vorherigen Schritt festgelegt. Sie können diesen Parameter in einer Filterklausel in der Abfrage verwenden, so dass false für die booleschen Filter auf die ausgewählten Länder- oder Regionsnamen angewendet wird und true effektiv kein Filter angewendet wird.

    Screenshot that shows the Select all Boolean used in the source query.

  5. Nachdem Sie Ihre M-Abfrage zur Berücksichtigung des neuen Select All-Werts aktualisiert haben, können Sie die Funktion Alle auswählen nun in Slicern oder Filtern verwenden:

    Screenshot that shows Select all in a slicer.

Hier ist die vollständige Abfrage für das vorherige Beispiel:

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ögliches Sicherheitsrisiko

Berichtsleser, die die Werte für M-Abfrageparameter dynamisch festlegen können, können möglicherweise mithilfe von Einschleusungsangriffen auf weitere Daten zugreifen oder Änderungen am Quellsystem auslösen. Diese Möglichkeit hängt davon ab, wie Sie auf die Parameter in der M-Abfrage verweisen und welche Werte Sie an die Parameter übergeben.

Angenommen, Sie haben eine parametrisierte Kusto-Abfrage wie die folgende erstellt:

Products
| where Category == [Parameter inserted here] & HasReleased == 'True'
 | project ReleaseDate, Name, Category, Region

Möglicherweise treten keine Probleme bei einem Friendly User auf, der einen geeigneten Wert für den Parameter übergibt, z. B. Games:

| where Category == 'Games' & HasReleased == 'True'

Ein Angreifer kann jedoch unter Umständen einen Wert übergeben, der die Abfrage ändert, um Zugriff auf weitere Daten zu erhalten, z. B. 'Games'// :

Products
| where Category == 'Games'// & HasReleased == 'True'
| project ReleaseDate, Name, Category, Region

In diesem Beispiel kann der Angreifer Zugriff auf Informationen zu Spielen erhalten, die noch nicht veröffentlicht wurden, indem er einen Teil der Abfrage in einen Kommentar umwandelt.

Verringern des Risikos

Zur Verringerung des Sicherheitsrisikos empfiehlt es sich, eine Zeichenfolgenverkettung von M-Parameterwerten in der Abfrage zu vermeiden. Verwenden Sie stattdessen die Parameterwerte in M-Vorgängen, die unter die Quellabfrage gefaltet werden, damit die M-Engine und der Connector die endgültige Abfrage erstellen.

Wenn eine Datenquelle den Import gespeicherter Prozeduren unterstützt, sollten Sie Ihre Abfragelogik dort speichern und in der M-Abfrage aufrufen. Alternativ können Sie einen in die Quellabfragesprache und die Connectors integrierten Mechanismus zur Parameterübergabe verwenden, sofern ein solcher vorhanden ist. Azure Data Explorer enthält beispielsweise integrierte Abfrageparameterfunktionen für den Schutz vor Angriffen durch Einschleusung.

Hier sind einige Beispiele für diese Risikominderungen:

  • Beispiel, das die Filtervorgänge der M-Abfrage verwendet:

    Table.SelectRows(Source, (r) => r[Columns] = Parameter)
    
  • Beispiel für das Deklarieren des Parameters in der Quellabfrage (oder das Übergeben des Parameterwerts als Eingabe für eine Quellabfragefunktion):

    declare query_parameters (Name of Parameter : Type of Parameter);
    
  • Beispiel für den direkten Aufruf einer gespeicherten Prozedur:

    let CustomerByProductFn = AzureDataExplorer.Contents("Help", "ContosoSales"){[Name="CustomerByProduct"]}[Data] in
    CustomerByProductFn({1, 3, 5})
    

Überlegungen und Einschränkungen

Bei der Verwendung von dynamischen M-Abfrageparametern sind einige Aspekte und Einschränkungen zu berücksichtigen:

  • Ein einzelner Parameter kann nicht an mehrere Felder gebunden werden oder umgekehrt.
  • Dynamische M-Abfrageparameter unterstützen keine Aggregationen.
  • Dynamische M-Abfrageparameter unterstützen keine Sicherheit auf Zeilenebene (Row-Level Security, RLS).
  • Parameternamen dürfen keine reservierten DAX-Wörter (Data Analysis Expressions) sein oder Leerzeichen enthalten. Wenn Sie den Zusatz Parameter am Ende des Parameternamens anfügen, können Sie diese Einschränkung umgehen.
  • Tabellennamen darf keine Leer- oder Sonderzeichen enthalten.
  • Wenn der Parameter vom Datentyp Date/Time ist, müssen Sie ihn innerhalb der M-Abfrage mit DateTime.Date(<YourDateParameter>) umwandeln.
  • Wenn Sie SQL-Quellen verwenden, bemerken Sie möglicherweise bei jeder Änderung des Parameterwerts ein Bestätigungsdialogfeld. Dies liegt an einer Sicherheitseinstellung: Benutzergenehmigung für neue native Datenbankabfragen verlangen. Sie finden diese Einstellung auf der Registerkarte Sicherheit des Dialogfelds Optionen in Power BI Desktop, wo Sie sie deaktivieren können.
  • Dynamische M-Abfrageparameter funktionieren möglicherweise nicht beim Zugriff auf ein semantisches Modell in Excel.
  • Dynamische M-Abfrageparameter werden auf Power BI-Berichtsservern nicht unterstützt.

Folgende vordefinierte Parametertypen werden nicht unterstützt:

  • Any
  • Duration
  • Wahr/falsch
  • Binary

Nicht unterstützte Filter

  • Slicer oder Filter für relative Zeitbereiche
  • Relatives Datum
  • Hierarchieslicer
  • Einschlussfilter für mehrere Felder
  • Ausschlussfilter/NOT-Filter
  • Übergreifende Hervorhebung
  • Drilldown-Filter
  • Crossdrillfilter
  • Top N-Filter

Nicht unterstützte Vorgänge

  • Und
  • Enthält
  • Kleiner als
  • Größer als
  • Beginnt mit
  • Beginnt nicht mit
  • Ist nicht
  • Enthält nicht
  • Ist leer
  • Ist nicht leer

Weitere Informationen zu den Funktionen von Power BI Desktop finden Sie in den folgenden Ressourcen: