Dela via


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

  1. I Power BI Desktop väljer du Starttransformera>data>Transformera data för att öppna Power Query-redigeraren.

  2. I Power Query-redigeraren väljer du Nya parametrar under Hantera parametrar i menyfliksområdet.

    Skärmbild som visar menyfliksområdet.

  3. I fönstret Hantera parametrar fyller du i informationen om parametern. Mer information finns i Skapa en parameter.

    Skärmbild som visar parameterinformation.

  4. Välj Ny för att lägga till fler parametrar.

    Skärmbild som visar Ny för att skapa en annan parameter.

  5. När du är klar med att lägga till parametrar väljer du OK.

Referera till parametrarna i M-frågan

  1. 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.

    Skärmbild som visar hur du öppnar Avancerad redigerare.

  2. Referera till parametrarna i M-frågan, så som de är markerade i gult i följande bild:

    Skärmbild som visar referens till parametern.

  3. 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.

  1. I menyfliksområdet Power BI Desktop går du till Modellering och väljer Ny tabell.

    Skärmbild som visar hur du väljer Ny tabell.

  2. Skapa en tabell för parameterns StartTime värden, till exempel:

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

    Skärmbild som visar den första tabellen.

  3. Skapa en andra tabell för parameterns EndTime värden, till exempel:

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

    Skärmbild som visar den andra tabellen.

    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.

  1. 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.

    Skärmbild som visar bindning av fältet till en parameter.

  2. Välj listrutan under Bind till parameter och välj den parameter som du vill binda till fältet:

    Skärmbild som visar bindning av parametern 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:

    Skärmbild som visar värdet Nej för flera val.

    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:

    Skärmbild som visar ett exempel på flera värden.

  3. Upprepa de här stegen om du har andra fält som ska bindas till andra parametrar.

    Skärmbild som visar hur du konfigurerar fler parametrar.

Du kan nu referera till det här fältet i ett utsnitt eller som ett filter:

Skärmbild som visar hur du refererar till fälten.

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:

Skärmbild som visar ett exempel på en multiselect M-parameter.

Så här aktiverar du Välj alla för Land:

  1. 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.

    Skärmbild som visar Välj alla för en M-parameter.

    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.

  2. 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 .

    Skärmbild som visar en M-fråga.

  3. 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 returnerar falseannars :

    Skärmbild som visar ett exempel på ett booleskt uttryck för Välj alla.

  4. 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å att false för de booleska filtren på de valda lands- eller regionnamnen och true i praktiken inte tillämpar något filter.

    Skärmbild som visar Välj alla booleska som används i källfrågan.

  5. 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.

    Skärmbild som visar Välj alla i ett utsnitt.

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, Gamestill 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 som DateTime.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

Mer information om Power BI Desktop-funktioner finns i följande resurser: