Dynamiske M-forespørgselsparametre i Power BI Desktop

Denne artikel beskriver, hvordan man opretter og arbejder med dynamiske M-forespørgselsparametre i Power BI Desktop. Med dynamiske M-forespørgselsparametre kan modelforfattere konfigurere de filter- eller udsnitsværdier, som rapportlæsere kan bruge til en M-forespørgselsparameter. Dynamiske M-forespørgselsparametre giver modelforfattere mere kontrol over de filtervalg, der skal inkorporeres i DirectQuery-kildeforespørgsler.

Modelforfattere forstår den tilsigtede semantik af deres filtre og ved ofte, hvordan de skriver effektive forespørgsler i forhold til deres datakilde. Med dynamiske M-forespørgselsparametre kan modelforfattere sikre, at filtervalg inkorporeres i kildeforespørgsler på det rigtige tidspunkt for at opnå de tilsigtede resultater med optimal ydeevne. Dynamiske M-forespørgselsparametre kan især være nyttige til optimering af forespørgselsydeevnen.

[! NOTE] Eksempler i denne artikel bruger både Kusto og T-SQL til at demonstrere dynamiske M-forespørgselsparametre. Begreberne gælder for alle understøttede DirectQuery-kilder. Når du forbinder til Fabric KQL-databaser (Real-Time Intelligence), brug Azure Data Explorer (Kusto)-connectoren — de samme mønstre gælder.

Se Sujata forklare og bruge dynamiske M-forespørgselsparametre i følgende video, og prøv dem derefter selv.

Bemærk

Denne video kan bruge tidligere versioner af Power BI Desktop eller Power BI-tjeneste.

Forudsætninger

Hvis du vil gennemgå disse procedurer, skal du have en gyldig M-forespørgsel , der bruger en eller flere DirectQuery-tabeller.

Opret og brug dynamiske parametre

I følgende eksempel overføres en enkelt værdi dynamisk til en parameter.

Tilføj parametre

  1. I Power BI Desktop skal du vælge Home>Transform data>Transform data for at åbne Power Query-editor.

  2. I Power Query-editor vælg Nye Parametre under Manage Parameters i båndet.

    Skærmbillede, der viser menuen Bånd.

  3. Udfyld oplysningerne om parameteren i vinduet Administrer parametre. Du kan få flere oplysninger under Oprettelse af en parameter.

    Skærmbillede, der viser parameteroplysninger.

  4. Vælg Ny for at tilføje flere parametre.

    Skærmbillede, der viser Ny for at oprette en anden parameter.

  5. Når du er færdig med at tilføje parametre, skal du vælge OK.

Reference til parametrene i M-forespørgslen

  1. Når du har oprettet parametrene, kan du referere til dem i M-forespørgslen. For at ændre M-forespørgslen, mens du har forespørgslen valgt, skal du åbne Avanceret editor.

    Skærmbillede, der viser åbning af Avanceret editor.

  2. Reference til parametrene i M-forespørgslen som fremhævet med gult på følgende billede:

    Skærmbillede, der viser reference til parameteren.

    Tips

    Hvis du vil referere til en parameter i M-kode, skal du bruge dens navn direkte (f.eks CountryParameter. ). For tekstparametre kan du sammenkæde som vist ovenfor. For dato- eller numeriske parametre skal du sikre dig, at datatypen stemmer overens.

    T-SQL-eksempel (enkelt parameter)

    let
          Source = Sql.Database("server", "database", [Query="SELECT * FROM Sales WHERE Country = '" & CountryParameter & "'"])
    in
          Source
    
  3. Når du er færdig med at redigere forespørgslen, skal du vælge Udført.

Opret tabeller med værdier

Opret en tabel for hver parameter med en kolonne, der leverer de mulige værdier, der kan angives dynamisk baseret på filtervalg. I dette eksempel skal parametrene StartTime og EndTime være dynamiske. Da disse parametre kræver en Date/Time parameter, genererer du de mulige input for dynamisk at angive datoen for parameteren.

  1. I Power BI Desktop-båndet, under Modeling, vælg Ny tabel.

    Skærmbillede, der viser, hvordan du vælger Ny tabel.

  2. Opret en tabel til værdierne i StartTime parameteren, f.eks.:

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

    Skærmbillede, der viser den første tabel.

  3. Opret en anden tabel for værdierne i EndTime parameteren, f.eks.:

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

    Skærmbillede, der viser den anden tabel.

    Bemærk

    Brug et kolonnenavn, der ikke findes i en faktisk tabel. Hvis du bruger det samme navn som en faktisk tabelkolonne, anvendes den valgte værdi som et filter i forespørgslen.

Bind felterne til parametrene

Nu, hvor du har oprettet tabellerne Date med felterne, kan du binde hvert felt til en parameter. Binding af et felt til en parameter betyder, at når den valgte feltværdi ændres, overføres værdien til parameteren og opdaterer den forespørgsel, der refererer til parameteren.

  1. For at binde et felt, vælg i Power BI Desktop Model visning det nyoprettede felt, og vælg i panelet EgenskaberAvanceret.

    Bemærk

    Kolonnedatatypen skal svare til M-parameterdatatypen.

    Skærmbillede, der viser binding af feltet til en parameter.

  2. Vælg rullelisten under Bind til parameter , og vælg den parameter, du vil binde til feltet:

    Skærmbillede, der viser binding af parameteren til feltet.

    Da dette eksempel er til angivelse af parameteren til en enkelt værdi, skal du holde Multi-select indstillet til Nej, hvilket er standarden:

    Skærmbillede, der viser, at flere markeringer er angivet til Nej.

    Hvis du angiver den tilknyttede kolonne til Nej for Flere markeringer, skal du bruge en enkelt markeringstilstand i udsnittet eller kræve enkelt markering på filterkortet.

    Hvis dine use cases kræver, at du overfører flere værdier til en enkelt parameter, skal du angive kontrolelementet til Ja og sørge for, at din M-forespørgsel er konfigureret til at acceptere flere værdier. Her er et eksempel på RepoNameParameter, som tillader flere værdier:

    Skærmbillede, der viser et eksempel med flere værdier.

  3. Gentag disse trin, hvis du har andre felter, der skal bindes til andre parametre.

    Skærmbillede, der viser konfiguration af flere parametre.

Bemærk

Rullelisten Bind til parameter er kun tilgængelig for understøttede DirectQuery-kilder og specifikke datatyper. Hvis du ikke kan se denne indstilling i modelvisning, skal du sikre dig, at du bruger en understøttet kilde og har oprettet parameteren korrekt. Denne funktion blev introduceret i Power BI Desktop i juni 2022.

Du kan nu referere til dette felt i et udsnit eller som et filter:

Skærmbillede, der viser henvisninger til felterne.

Aktivér Markér alle

I dette eksempel har Power BI Desktop-modellen et felt kaldet Land, som er en liste over lande/regioner bundet til en M-parameter kaldet landNavnMParameter. Denne parameter er aktiveret for Flere markeringer, men er ikke aktiveret for Vælg alle. Hvis du vil kunne bruge indstillingen Vælg alle på et udsnits- eller filterkort, skal du udføre følgende tilføjede trin:

Skærmbillede, der viser et eksempel på en M-parameter med flere markeringer.

Sådan aktiverer du Vælg alle for Land:

  1. I avancerede egenskaber for Land skal du aktivere til/fra-knappen Vælg alle, som aktiverer inputtet Vælg alle værdier. Rediger værdien Vælg alle , eller bemærk standardværdien.

    Skærmbillede, der viser Vælg alle for en M-parameter.

    Værdien Select all overføres til parameteren som en liste, der indeholder den værdi, du har defineret. Når du definerer denne værdi eller bruger standardværdien, skal du derfor sørge for, at værdien er entydig og ikke findes i det felt, der er bundet til parameteren.

  2. Start Power Query-editor, vælg forespørgslen, og vælg derefter Avanceret editor. Rediger M-forespørgslen for at bruge værdien Vælg alle til at referere til indstillingen Vælg alle.

    Skærmbillede, der viser en M-forespørgsel.

  3. I Avanceret editor tilføjes et boolesk udtryk, der evaluerer til true hvis parameteren er aktiveret for Multi-select og indeholder Select all value, og ellers returnerer false:

    Skærmbillede, der viser et eksempel på et boolesk udtryk for Vælg alle.

  4. Indarbejde resultatet af udtrykket Vælg alle booleske i kildeforespørgslen. Eksemplet har en boolesk forespørgselsparameter i kildeforespørgslen, der kaldes includeAllCountries , og som er angivet til resultatet af det booleske udtryk fra det forrige trin. Du kan bruge denne parameter i en filterdelsætning i forespørgslen, så false for de booleske filtre til de valgte lande- eller områdenavne og true effektivt anvender intet filter.

    Skærmbillede, der viser Vælg alle booleske elementer, der bruges i kildeforespørgslen.

  5. Når du har opdateret din M-forespørgsel, så den tager højde for den nye Select all-værdi, kan du bruge funktionen Vælg alle i udsnit eller filtre.

    Skærmbillede, der viser Vælg alle i et udsnit.

Her er den fulde forespørgsel for det foregående eksempel:

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"

Potentiel sikkerhedsrisiko

Rapportlæsere, der dynamisk kan angive værdierne for M-forespørgselsparametre, kan muligvis få adgang til flere data eller udløse ændringer af kildesystemet ved hjælp af injektionsangreb. Denne mulighed afhænger af, hvordan du refererer til parametrene i M-forespørgslen, og hvilke værdier du overfører til parametrene.

Du har f.eks. oprettet en Kusto-forespørgsel med parametre på følgende måde:

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

Der er ingen problemer med en brugervenlig bruger, der overfører en passende værdi for parameteren, Gamesf.eks.:

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

En hacker kan dog muligvis overføre en værdi, der ændrer forespørgslen for at få adgang til flere data, 'Games'//f.eks.:

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

I dette eksempel kan angriberen få adgang til oplysninger om spil, der endnu ikke er udgivet, ved at ændre en del af forespørgslen til en kommentar.

Reducer risikoen

Undgå strengsammenkædning af M-parameterværdier i forespørgslen for at afhjælpe sikkerhedsrisikoen. Brug i stedet de parameterværdier i M-handlinger, der foldes til kildeforespørgslen, så M-programmet og connectoren konstruerer den endelige forespørgsel.

Hvis en datakilde understøtter import af lagrede procedurer, kan du overveje at gemme din forespørgselslogik der og aktivere den i M-forespørgslen. Hvis det er muligt, kan du også bruge en mekanisme til parameteroverførsel, der er indbygget i kildeforespørgselssproget og -connectorerne. For eksempel har Azure Data Explorer indbyggede forespørgselsparameter-funktioner, der er designet til at beskytte mod injektionsangreb.

Her er nogle eksempler på disse afhjælpninger:

  • Eksempel, der bruger M-forespørgslens filtreringshandlinger:

    Table.SelectRows(Source, (r) => r[Columns] = Parameter)
    
  • Eksempel, der deklarerer parameteren i kildeforespørgslen eller overfører parameterværdien som et input til en kildeforespørgselsfunktion:

    declare query_parameters (Name of Parameter : Type of Parameter);
    
  • Eksempel på direkte kald af en lagret procedure:

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

Overvejelser og begrænsninger

Bemærk

For Fabric KQL-databaser og Azure Data Explorer, skub aggregeringslogik (make-series, summarize, series_decompose_anomalies) til kildekoden i stedet for at returnere rå begivenheder til Power BI. Dette er især vigtigt for tidsseriedata med stor volumen — at lade visuelle materialer forbruge forudaggregerede resultater opretholder den interaktive forespørgselsydelse.

Der er nogle overvejelser og begrænsninger, du skal tage højde for, når du bruger dynamiske M-forespørgselsparametre:

  • En enkelt parameter kan ikke bindes til flere felter eller omvendt.
  • Dynamiske M-forespørgselsparametre understøtter ikke sammenlægninger.
  • Dynamiske M-forespørgselsparametre understøtter ikke sikkerhed på rækkeniveau .
  • Parameternavne må ikke være DAX-reserverede ord (Data Analysis Expressions) eller indeholde mellemrum. Du kan føje Parameter til slutningen af parameternavnet for at undgå denne begrænsning.
  • Tabelnavne må ikke indeholde mellemrum eller specialtegn.
  • Hvis din parameter er Date/Time datatypen, skal du angive den i M-forespørgslen som DateTime.Date(<YourDateParameter>).
  • Hvis du bruger SQL-kilder, får du muligvis en bekræftelsesdialogboks, hver gang parameterværdien ændres. Denne dialogboks skyldes en sikkerhedsindstilling: Kræv brugergodkendelse for nye oprindelige databaseforespørgsler. Du kan finde og slå denne indstilling fra i sektionen Security i Power BI Desktop Options.
  • Dynamiske M-forespørgselsparametre virker måske ikke, når man tilgår en semantisk model i Excel.
  • Dynamiske M-forespørgselsparametre understøttes ikke på Power BI-rapportserver.
  • Skift af datakilder ved hjælp af dynamiske M-forespørgselsparametre understøttes ikke i Power BI-tjeneste. Se opdatering og dynamiske datakilder for at få flere oplysninger.

Ikke-understøttede standardparametertyper

  • Enhver
  • Varighed
  • Sand/Falsk
  • Binær

Ikke-understøttede filtre

  • Udsnitsværktøj eller filter for relativ tid
  • Relativ dato
  • Hierarkiudsnit
  • Medtag filter med flere felter
  • Udelad filtre/Ikke-filtre
  • Tværgående fremhævning
  • Detailudledningsfilter
  • Tværgående analysefilter
  • Top N-filter

Ikke-understøttede handlinger

  • Og
  • Indeholder
  • Mindre end
  • Større end
  • Starter med
  • Starter ikke med
  • Er ikke
  • Indeholder ikke
  • Er tom
  • Er ikke tom

For mere information om Power BI Desktops funktioner, se følgende ressourcer: