Dynamiske M-forespørgselsparametre i Power BI Desktop
I denne artikel beskrives det, hvordan du 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.
Se Sujata forklare og bruge dynamiske M-forespørgselsparametre i følgende video, og prøv dem derefter selv.
Bemærk
Denne video bruger muligvis 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
I Power BI Desktop skal du vælge Transformér data>til startsiden>Transformér data for at åbne Power Query-editor.
I Power Query-editor skal du vælge Nye parametre under Administrer parametre på båndet.
Udfyld oplysningerne om parameteren i vinduet Administrer parametre. Du kan få flere oplysninger under Oprettelse af en parameter.
Vælg Ny for at tilføje flere parametre.
Når du er færdig med at tilføje parametre, skal du vælge OK.
Reference til parametrene i M-forespørgslen
Når du har oprettet parametrene, kan du referere til dem i M-forespørgslen. Hvis du vil ændre M-forespørgslen, mens du har valgt forespørgslen, skal du åbne Avanceret editor.
Reference til parametrene i M-forespørgslen som fremhævet med gult på følgende billede:
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.
På båndet i Power BI Desktop under Udformning skal du vælge Ny tabel.
Opret en tabel til værdierne i
StartTime
parameteren, f.eks.:StartDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Opret en anden tabel for værdierne i
EndTime
parameteren, f.eks.:EndDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
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.
Hvis du vil binde et felt, skal du vælge det nyoprettede felt i visningen Power BI Desktop-model og vælge Avanceret i ruden Egenskaber.
Bemærk
Kolonnedatatypen skal svare til M-parameterdatatypen.
Vælg rullelisten under Bind til parameter , og vælg den parameter, du vil binde 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:
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:Gentag disse trin, hvis du har andre felter, der skal bindes til andre parametre.
Du kan nu referere til dette felt i et udsnit eller som et filter:
Aktivér Markér alle
I dette eksempel har Power BI Desktop-modellen et felt med navnet Country, som er en liste over lande/områder, der er bundet til en M-parameter kaldet countryNameMParameter. 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:
Sådan aktiverer du Vælg alle for Land:
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.
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.
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.
I Avanceret editor skal du tilføje et boolesk udtryk, der evalueres til
true
, hvis parameteren er aktiveret for Multi-select og indeholder værdien Select all og ellers returnererfalse
: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 ogtrue
effektivt anvender intet filter.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.
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, Games
f.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. Azure Data Explorer har f.eks. indbyggede egenskaber for forespørgselsparametre, der er udviklet 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
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 somDateTime.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 deaktivere denne indstilling i afsnittet Sikkerhed i Indstillinger for Power BI Desktop.
- Dynamiske M-forespørgselsparametre fungerer muligvis ikke, når du får adgang til 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
- Any
- 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
- And
- Indeholder
- Mindre end
- Større end
- Starter med
- Starter ikke med
- Er ikke
- Indeholder ikke
- Er tom
- Er ikke tom
Relateret indhold
Du kan få flere oplysninger om funktioner i Power BI Desktop i følgende ressourcer: