Dynamiska M-frågeparametrar i Power BI Desktop
Den här artikeln beskriver hur du skapar och arbetar med dynamiska M-frågeparametrar i Power BI Desktop. Med dynamiska M-frågeparametrar kan modellförfattare konfigurera de filter- eller utsnittsvärden som rapportvisningsanvändare kan använda för en M-frågeparameter. Dynamiska M-frågeparametrar ger modellförfattare mer kontroll över filtervalen som ska införlivas i DirectQuery-källfrågor.
Modellförfattare förstår de avsedda semantiken i sina filter och vet ofta hur man skriver effektiva frågor mot sin datakälla. Med dynamiska M-frågeparametrar kan modellförfattare se till att filterval införlivas i källfrågor vid rätt tidpunkt för att uppnå de avsedda resultaten med optimal prestanda. Dynamiska M-frågeparametrar kan vara särskilt användbara för frågeprestandaoptimering.
Se Sujata förklara och använda dynamiska M-frågeparametrar i följande video och prova dem sedan själv.
Kommentar
Den här videon kan använda tidigare versioner av Power BI Desktop eller Power BI-tjänst.
Förutsättningar
Om du vill gå igenom dessa procedurer måste du ha en giltig M-fråga som använder en eller flera DirectQuery-tabeller.
Skapa och använda dynamiska parametrar
I följande exempel skickas ett enda värde till en parameter dynamiskt.
Lägga till parametrar
I Power BI Desktop väljer du Starttransformera>data>Transformera data för att öppna Power Query-redigeraren.
I Power Query-redigeraren väljer du Nya parametrar under Hantera parametrar i menyfliksområdet.
I fönstret Hantera parametrar fyller du i informationen om parametern. Mer information finns i Skapa en parameter.
Välj Ny för att lägga till fler parametrar.
När du är klar med att lägga till parametrar väljer du OK.
Referera till parametrarna i M-frågan
När du har skapat parametrarna kan du referera till dem i M-frågan. Om du vill ändra M-frågan öppnar du Avancerad redigerare medan du har valt frågan.
Referera till parametrarna i M-frågan, så som de är markerade i gult i följande bild:
När du är klar med redigeringen av frågan väljer du Klar.
Skapa tabeller med värden
Skapa en tabell för varje parameter med en kolumn som ger de möjliga värden som kan anges dynamiskt baserat på filterval. I det här exemplet vill du att parametrarna StartTime
och EndTime
ska vara dynamiska. Eftersom dessa parametrar kräver en Date/Time
parameter genererar du möjliga indata för att dynamiskt ange datumet för parametern.
I menyfliksområdet Power BI Desktop går du till Modellering och väljer Ny tabell.
Skapa en tabell för parameterns
StartTime
värden, till exempel:StartDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Skapa en andra tabell för parameterns
EndTime
värden, till exempel:EndDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Kommentar
Använd ett kolumnnamn som inte finns i en faktisk tabell. Om du använder samma namn som en faktisk tabellkolumn tillämpas det valda värdet som ett filter i frågan.
Binda fälten till parametrarna
Nu när du har skapat tabellerna med fälten Date
kan du binda varje fält till en parameter. Att binda ett fält till en parameter innebär att när det valda fältvärdet ändras skickas värdet till parametern och uppdaterar frågan som refererar till parametern.
Om du vill binda ett fält i vyn Power BI Desktop-modell väljer du det nyligen skapade fältet och i fönstret Egenskaper väljer du Avancerat.
Kommentar
Kolumndatatypen ska matcha datatypen M-parameter.
Välj listrutan under Bind till parameter och välj den parameter som du vill binda till fältet:
Eftersom det här exemplet är för att ställa in parametern på ett enda värde ska du behålla Multi-select inställt på Nej, vilket är standardvärdet:
Om du ställer in den mappade kolumnen på Nej för Flera val måste du använda ett enda select-läge i utsnittet eller kräva enkelmarkering på filterkortet.
Om dina användningsfall kräver att flera värden skickas till en enda parameter ställer du in kontrollen på Ja och ser till att M-frågan har konfigurerats för att acceptera flera värden. Här är ett exempel för
RepoNameParameter
, som tillåter flera värden:Upprepa de här stegen om du har andra fält som ska bindas till andra parametrar.
Du kan nu referera till det här fältet i ett utsnitt eller som ett filter:
Aktivera Välj alla
I det här exemplet har Power BI Desktop-modellen ett fält med namnet Land, som är en lista över länder/regioner som är bundna till en M-parameter med namnet countryNameMParameter. Den här parametern är aktiverad för Multi-select, men är inte aktiverad för Välj alla. Utför följande steg för att kunna använda alternativet Välj alla i ett utsnitt eller filterkort:
Så här aktiverar du Välj alla för Land:
I Avancerade egenskaper för Land aktiverar du växlingsknappen Välj alla, vilket aktiverar indata för Välj alla värden. Redigera värdet Välj alla eller anteckna standardvärdet.
Värdet Välj alla skickas till parametern som en lista som innehåller det värde som du har definierat. När du definierar det här värdet eller använder standardvärdet kontrollerar du därför att värdet är unikt och inte finns i fältet som är bundet till parametern.
Starta Power Query-redigeraren, välj frågan och välj sedan Avancerad redigerare. Redigera M-frågan för att använda värdet Välj alla för att referera till alternativet Välj alla .
I Avancerad redigerare lägger du till ett booleskt uttryck som utvärderas till
true
om parametern är aktiverad för Multi-select och innehåller värdet Välj alla och returnerarfalse
annars :Införliva resultatet av välj alla booleska uttryck i källfrågan. Exemplet har en boolesk frågeparameter i källfrågan med namnet
includeAllCountries
som är inställd på resultatet av det booleska uttrycket från föregående steg. Du kan använda den här parametern i en filtersats i frågan, så attfalse
för de booleska filtren på de valda lands- eller regionnamnen ochtrue
i praktiken inte tillämpar något filter.När du har uppdaterat M-frågan för att ta hänsyn till det nya värdet Välj alla kan du använda funktionen Välj alla i utsnitt eller filter.
Som referens här är den fullständiga frågan för föregående exempel:
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"
Potentiell säkerhetsrisk
Rapportläsare som dynamiskt kan ange värden för M-frågeparametrar kan komma åt fler data eller utlösa ändringar i källsystemet med hjälp av inmatningsattacker. Den här möjligheten beror på hur du refererar till parametrarna i M-frågan och vilka värden du skickar till parametrarna.
Du har till exempel en parametriserad Kusto-fråga konstruerad på följande sätt:
Products
| where Category == [Parameter inserted here] & HasReleased == 'True'
| project ReleaseDate, Name, Category, Region
Det finns inga problem med en användarvänlig användare som skickar ett lämpligt värde för parametern, Games
till exempel :
| where Category == 'Games' & HasReleased == 'True'
En angripare kan dock skicka ett värde som ändrar frågan för att få åtkomst till mer data, till exempel 'Games'//
:
Products
| where Category == 'Games'// & HasReleased == 'True'
| project ReleaseDate, Name, Category, Region
I det här exemplet kan angriparen få åtkomst till information om spel som inte har släppts ännu genom att ändra en del av frågan till en kommentar.
Minska risken
Undvik strängsammanfogning av M-parametervärden i frågan för att minska säkerhetsrisken. Använd i stället de parametervärden i M-åtgärder som viks till källfrågan, så att M-motorn och anslutningsappen skapar den slutliga frågan.
Om en datakälla stöder import av lagrade procedurer kan du överväga att lagra din frågelogik där och anropa den i M-frågan. Om det är tillgängligt kan du också använda en mekanism för parameteröverföring som är inbyggd i källfrågespråket och anslutningsapparna. Azure Data Explorer har till exempel inbyggda frågeparameterfunktioner som är utformade för att skydda mot inmatningsattacker.
Här är några exempel på dessa åtgärder:
Exempel som använder M-frågans filtreringsåtgärder:
Table.SelectRows(Source, (r) => r[Columns] = Parameter)
Exempel som deklarerar parametern i källfrågan eller skickar parametervärdet som indata till en källfrågefunktion:
declare query_parameters (Name of Parameter : Type of Parameter);
Exempel på att anropa en lagrad procedur direkt:
let CustomerByProductFn = AzureDataExplorer.Contents("Help", "ContosoSales"){[Name="CustomerByProduct"]}[Data] in CustomerByProductFn({1, 3, 5})
Beaktanden och begränsningar
Det finns några överväganden och begränsningar att ta hänsyn till när du använder dynamiska M-frågeparametrar:
- En enskild parameter kan inte bindas till flera fält eller vice versa.
- Dynamiska M-frågeparametrar stöder inte aggregeringar.
- Dynamiska M-frågeparametrar stöder inte säkerhet på radnivå (RLS).
- Parameternamn får inte vara reserverade ord för dataanalysuttryck (DAX) eller innehålla blanksteg. Du kan lägga
Parameter
till i slutet av parameternamnet för att undvika den här begränsningen. - Tabellnamn får inte innehålla blanksteg eller specialtecken.
- Om parametern är
Date/Time
datatypen måste du omvandla den i M-frågan somDateTime.Date(<YourDateParameter>)
. - Om du använder SQL-källor kan du få en bekräftelsedialogruta varje gång parametervärdet ändras. Den här dialogrutan beror på en säkerhetsinställning: Kräv användargodkännande för nya interna databasfrågor. Du hittar och inaktiverar den här inställningen i avsnittet Säkerhet i Power BI Desktop-alternativ.
- Dynamiska M-frågeparametrar kanske inte fungerar vid åtkomst till en semantisk modell i Excel.
- Dynamiska M-frågeparametrar stöds inte på Power BI-rapportserver.
- Det går inte att växla datakällor med dynamiska M-frågeparametrar i Power BI-tjänst. Mer information finns i Uppdatera och dynamiska datakällor .
Parametertyper som inte stöds
- Alla
- Varaktighet
- Sant/falskt
- Binära
Filter som inte stöds
- Relativt tidssnitt eller filter
- Relativt datum
- Hierarki utsnitt
- Inkluderingsfilter för flera fält
- Exkludera filter/Inte filter
- Korsmarkering
- Filter för ökad detaljnivå
- Filter för flera detaljnivå
- Översta N-filtret
Åtgärder som inte stöds
- och
- Innehåller
- Mindre än
- Större än
- Börjar med
- Börjar inte med
- Är inte
- Innehåller inte
- Är tom
- Är inte tom
Relaterat innehåll
Mer information om Power BI Desktop-funktioner finns i följande resurser: