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.

    Screenshot that shows the Ribbon menu.

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

    Screenshot that shows parameter information.

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

    Screenshot that shows New to create another 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, medan du har valt frågan, öppnar du Avancerad redigerare.

    Screenshot that shows opening the Advanced Editor.

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

    Screenshot that shows referencing the parameter.

  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.

    Screenshot that shows selecting New table.

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

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

    Screenshot that shows the first table.

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

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

    Screenshot that shows the second table.

    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.

    Screenshot that shows binding the field to a parameter.

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

    Screenshot that shows binding the parameter to the field.

    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:

    Screenshot that shows multi-select set to No.

    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:

    Screenshot that shows a multivalue example.

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

    Screenshot that shows configuring more parameters.

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

Screenshot that shows referencing the fields.

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:

Screenshot that shows an example of a 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.

    Screenshot that shows Select all for an 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 .

    Screenshot that shows an M query.

  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 :

    Screenshot that shows an example Boolean expression for Select all.

  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.

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

  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.

    Screenshot that shows Select all in a slicer.

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, 'Games'//till exempel :

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 parameteröverföringsmekanism 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 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.

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å
  • Korsgranskningsfilter
  • Ö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: