พารามิเตอร์คิวรี M แบบไดนามิกใน Power BI Desktop

บทความนี้อธิบายวิธีการสร้างและทํางานกับพารามิเตอร์คิวรี M แบบไดนามิกใน Power BI Desktop ด้วยพารามิเตอร์คิวรี M แบบไดนามิก ผู้สร้างแบบจําลองสามารถกําหนดค่าตัวกรองหรือตัวแบ่งส่วนข้อมูลที่ผู้ชมรายงานสามารถใช้สําหรับ พารามิเตอร์คิวรี M ได้ พารามิเตอร์คิวรี M แบบไดนามิกช่วยให้ผู้สร้างแบบจําลองสามารถควบคุมการเลือกตัวกรองได้มากขึ้นเพื่อรวมเข้ากับคิวรีแหล่งข้อมูล DirectQuery

ผู้สร้างแบบจําลองเข้าใจความหมายที่ตั้งใจไว้ของตัวกรอง และบ่อยครั้งที่ทราบวิธีการเขียนคิวรีที่มีประสิทธิภาพกับแหล่งข้อมูล ด้วยพารามิเตอร์คิวรี M แบบไดนามิก ผู้สร้างแบบจําลองสามารถมั่นใจได้ว่าการเลือกตัวกรองจะรวมเข้ากับคิวรีต้นทางที่จุดที่เหมาะสมเพื่อให้ได้ผลลัพธ์ที่ตั้งใจไว้พร้อมประสิทธิภาพสูงสุด พารามิเตอร์คิวรี M แบบไดนามิกอาจมีประโยชน์อย่างยิ่งสําหรับการเพิ่มประสิทธิภาพการทํางานของคิวรี

ดู Sujata อธิบายและใช้พารามิเตอร์คิวรี M แบบไดนามิกในวิดีโอต่อไปนี้ แล้วลองใช้ด้วยตนเอง

หมายเหตุ

วิดีโอนี้อาจใช้ Power BI Desktop หรือบริการของ Power BI เวอร์ชันก่อนหน้า

ข้อกำหนดเบื้องต้น

ในการทํางานผ่านขั้นตอนเหล่านี้ คุณต้องมีคิวรี M ที่ถูกต้องที่ใช้ตาราง DirectQuery อย่างน้อยหนึ่งตาราง

สร้างและใช้พารามิเตอร์แบบไดนามิก

ตัวอย่างต่อไปนี้ส่งผ่านค่าเดียวผ่านไปยังพารามิเตอร์แบบไดนามิก

เพิ่มพารามิเตอร์

  1. ใน Power BI Desktop ให้เลือก แปลงข้อมูลในหน้าแรก>แปลงข้อมูล> เพื่อเปิดตัวแก้ไข Power Query

  2. ในตัวแก้ไข Power Query เลือกพารามิเตอร์ใหม่ภายใต้จัดการพารามิเตอร์ใน ribbon

    Screenshot that shows the Ribbon menu.

  3. ในหน้าต่าง จัดการพารามิเตอร์ ให้กรอกข้อมูลเกี่ยวกับพารามิเตอร์ สําหรับข้อมูลเพิ่มเติม ให้ดู สร้างพารามิเตอร์

    Screenshot that shows parameter information.

  4. เลือก ใหม่ เพื่อเพิ่มพารามิเตอร์เพิ่มเติม

    Screenshot that shows New to create another parameter.

  5. เมื่อคุณเพิ่มพารามิเตอร์เสร็จแล้ว เลือกตกลง

อ้างอิงพารามิเตอร์ในคิวรี M

  1. เมื่อคุณสร้างพารามิเตอร์แล้ว คุณสามารถอ้างอิงข้อมูลเหล่านั้นในคิวรี M ได้ หากต้องการปรับเปลี่ยนคิวรี M ในขณะที่คุณเลือกคิวรีไว้ ให้เปิดตัว แก้ไขขั้นสูง

    Screenshot that shows opening the Advanced Editor.

  2. อ้างอิงพารามิเตอร์ในคิวรี M ตามที่ไฮไลต์เป็นสีเหลืองในรูปต่อไปนี้:

    Screenshot that shows referencing the parameter.

  3. เมื่อคุณแก้ไขคิวรีเสร็จแล้ว ให้เลือก เสร็จสิ้น

สร้างตารางของค่า

สร้างตารางสําหรับแต่ละพารามิเตอร์ด้วยคอลัมน์ที่มีค่าที่เป็นไปได้ที่สามารถตั้งค่าได้แบบไดนามิกตามการเลือกตัวกรอง ในตัวอย่างนี้ คุณต้องการ StartTime ให้พารามิเตอร์ และ EndTime เป็นแบบไดนามิก เนื่องจากพารามิเตอร์เหล่านี้จําเป็นต้องมี Date/Time พารามิเตอร์ คุณจึงสร้างอินพุตที่เป็นไปได้เพื่อตั้งค่าวันที่สําหรับพารามิเตอร์แบบไดนามิก

  1. ในริบบอน Power BI Desktop ภายใต้ การวางรูปแบบ ให้เลือก ตารางใหม่

    Screenshot that shows selecting New table.

  2. สร้างตารางสําหรับค่าของ StartTime พารามิเตอร์ ตัวอย่างเช่น:

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

    Screenshot that shows the first table.

  3. สร้างตารางที่สองสําหรับค่าของ EndTime พารามิเตอร์ ตัวอย่างเช่น:

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

    Screenshot that shows the second table.

    หมายเหตุ

    ใช้ชื่อคอลัมน์ที่ไม่ได้อยู่ในตารางจริง ถ้าคุณใช้ชื่อเดียวกันกับคอลัมน์ตารางจริง ค่าที่เลือกจะใช้เป็นตัวกรองในคิวรี

ผูกเขตข้อมูลกับพารามิเตอร์

หลังจากที่คุณสร้างตารางที่มี Date เขตข้อมูลแล้ว คุณสามารถผูกเขตข้อมูลแต่ละรายการกับพารามิเตอร์ได้ การผูกเขตข้อมูลกับพารามิเตอร์หมายความว่าเมื่อค่าเขตข้อมูลที่เลือกเปลี่ยนแปลง ค่าจะส่งผ่านไปยังพารามิเตอร์และอัปเดตคิวรีที่อ้างอิงพารามิเตอร์

  1. เมื่อต้องผูกเขตข้อมูล ในมุมมองแบบจําลอง Power BI Desktop เลือกเขตข้อมูลที่สร้างขึ้นใหม่ และในบานหน้าต่างคุณสมบัติ เลือกขั้นสูง

    หมายเหตุ

    ชนิดข้อมูลของคอลัมน์ควรตรงกับชนิดข้อมูลพารามิเตอร์ M

    Screenshot that shows binding the field to a parameter.

  2. เลือกรายการแบบเลื่อนลงภายใต้ ผูกกับพารามิเตอร์ และเลือกพารามิเตอร์ที่คุณต้องการผูกกับเขตข้อมูล:

    Screenshot that shows binding the parameter to the field.

    เนื่องจากตัวอย่างนี้สําหรับการตั้งค่าพารามิเตอร์เป็นค่าเดียว ให้เก็บ การตั้งค่าแบบเลือก ได้หลายรายการเป็น ไม่ ซึ่งเป็นค่าเริ่มต้น:

    Screenshot that shows multi-select set to No.

    ถ้าคุณตั้งค่าคอลัมน์ที่ถูกแมปเป็น ไม่ สําหรับ การเลือกหลายรายการ คุณต้องใช้โหมดเลือกเดียวในตัวแบ่งส่วนข้อมูล หรือจําเป็นต้องเลือกเพียงครั้งเดียวในการ์ดตัวกรอง

    ถ้ากรณีการใช้งานของคุณจําเป็นต้องมีการส่งผ่านค่าหลายค่าไปยังพารามิเตอร์เดียว ให้ตั้งค่าตัวควบคุมเป็น ใช่ และตรวจสอบให้แน่ใจว่าคิวรี M ของคุณได้รับการตั้งค่าให้ยอมรับหลายค่า นี่คือตัวอย่างสําหรับ RepoNameParameterซึ่งอนุญาตให้มีหลายค่า:

    Screenshot that shows a multivalue example.

  3. ทําซ้ําขั้นตอนเหล่านี้ถ้าคุณมีเขตข้อมูลอื่นๆ ที่จะผูกกับพารามิเตอร์อื่นๆ

    Screenshot that shows configuring more parameters.

ขณะนี้คุณสามารถอ้างอิงเขตข้อมูลนี้ในตัวแบ่งส่วนข้อมูลหรือเป็นตัวกรอง:

Screenshot that shows referencing the fields.

เปิดใช้งานเลือกทั้งหมด

ในตัวอย่างนี้ แบบจําลอง Power BI Desktop มีเขตข้อมูลที่เรียกว่า ประเทศ ซึ่งเป็นรายการของประเทศ/ภูมิภาคที่ผูกกับพารามิเตอร์ M ที่เรียกว่า countryNameMParameter พารามิเตอร์นี้เปิดใช้งานสําหรับการเลือกหลายรายการ แต่ไม่ได้เปิดใช้งานสําหรับ เลือกทั้งหมด เพื่อให้สามารถใช้ ตัวเลือก เลือกทั้งหมด ในตัวแบ่งส่วนข้อมูลหรือบัตรตัวกรอง ให้ทําตามขั้นตอนที่เพิ่มเข้ามาต่อไปนี้:

Screenshot that shows an example of a multiselect M parameter.

เมื่อต้องการเปิดใช้งาน เลือกทั้งหมด สําหรับ ประเทศ:

  1. ใน คุณสมบัติขั้นสูง สําหรับ ประเทศ ให้เปิดใช้งานการ สลับเลือกทั้งหมด ซึ่งเปิดใช้งานการป้อนข้อมูลเลือก ค่า ทั้งหมด แก้ไขค่า เลือกทั้งหมด หรือจดค่าเริ่มต้น

    Screenshot that shows Select all for an M parameter.

    ค่า เลือกทั้งหมด จะส่งผ่านไปยังพารามิเตอร์เป็นรายการที่ประกอบด้วยค่าที่คุณกําหนดไว้ ดังนั้น เมื่อคุณกําหนดค่านี้หรือใช้ค่าเริ่มต้น ตรวจสอบให้แน่ใจว่าค่าไม่ซ้ํากัน และไม่มีอยู่ในเขตข้อมูลที่ผูกไว้กับพารามิเตอร์

  2. เปิดใช้ตัวแก้ไข Power Query เลือกคิวรี จากนั้นเลือก เครื่องมือแก้ไขขั้นสูง แก้ไขคิวรี M เพื่อใช้ค่า เลือกทั้งหมด เพื่ออ้างอิงถึงตัวเลือก เลือกทั้งหมด

    Screenshot that shows an M query.

  3. ในเครื่องมือแก้ไขขั้นสูง ให้เพิ่มนิพจน์บูลีนที่ประเมินเป็น true ถ้าพารามิเตอร์ถูกเปิดใช้งานสําหรับ การเลือกหลายรายการ และมี เลือกค่าทั้งหมด และจะแสดงเป็น falseอย่างอื่น :

    Screenshot that shows an example Boolean expression for Select all.

  4. รวมผลลัพธ์ของเลือก นิพจน์บูลีนทั้งหมด ลงในคิวรีแหล่งข้อมูล ตัวอย่างมีพารามิเตอร์คิวรีบูลีนในคิวรีต้นทางที่เรียกว่า includeAllCountries ที่ถูกตั้งค่าเป็นผลลัพธ์ของนิพจน์บูลีนจากขั้นตอนก่อนหน้า คุณสามารถใช้พารามิเตอร์นี้ในส่วนคําสั่งตัวกรองในคิวรี ดังกล่าว false สําหรับตัวกรองบูลีนกับชื่อประเทศหรือภูมิภาคที่เลือก และ true ไม่มีตัวกรองได้อย่างมีประสิทธิภาพ

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

  5. เมื่อคุณอัปเดตคิวรี M ของคุณเป็นบัญชีสําหรับค่า เลือกทั้งหมด ใหม่ คุณสามารถใช้ฟังก์ชัน เลือกทั้งหมด ในตัวแบ่งส่วนข้อมูลหรือตัวกรองได้

    Screenshot that shows Select all in a slicer.

สําหรับการอ้างอิง นี่คือคิวรีแบบเต็มสําหรับตัวอย่างก่อนหน้า:

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"

ความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้น

ผู้อ่านรายงานที่สามารถตั้งค่าสําหรับพารามิเตอร์คิวรี M แบบไดนามิกอาจสามารถเข้าถึงข้อมูลเพิ่มเติมหรือทริกเกอร์การปรับเปลี่ยนไปยังระบบต้นทางโดยใช้ การโจมตีการฉีด ความเป็นไปได้นี้ขึ้นอยู่กับวิธีที่คุณอ้างอิงพารามิเตอร์ในคิวรี M และค่าที่คุณส่งผ่านไปยังพารามิเตอร์

ตัวอย่างเช่น คุณมีคิวรี Kusto ที่มีการกําหนดพารามิเตอร์ที่สร้างขึ้นดังนี้:

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

ไม่มีปัญหากับผู้ใช้ที่เป็นมิตรที่ส่งผ่านค่าที่เหมาะสมสําหรับพารามิเตอร์ ตัวอย่างเช่น Games:

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

อย่างไรก็ตาม ผู้โจมตีอาจสามารถส่งผ่านค่าที่ปรับเปลี่ยนคิวรีเพื่อเข้าถึงข้อมูลเพิ่มเติม ตัวอย่างเช่น 'Games'//:

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

ในตัวอย่างนี้ ผู้โจมตีสามารถเข้าถึงข้อมูลเกี่ยวกับเกมที่ยังไม่ได้เผยแพร่ โดยการเปลี่ยนแปลงส่วนของแบบสอบถามลงในข้อคิดเห็น

ลดความเสี่ยง

เมื่อต้องการลดความเสี่ยงด้านความปลอดภัย ให้หลีกเลี่ยงการเรียงต่อกันของค่าพารามิเตอร์ M ภายในคิวรี แทนที่จะใช้ค่าพารามิเตอร์เหล่านั้นในการดําเนินการ M ที่พับไปยังคิวรีแหล่งข้อมูลเพื่อให้กลไกจัดการ M และตัวเชื่อมต่อสร้างคิวรีสุดท้าย

ถ้าแหล่งข้อมูลสนับสนุนการนําเข้ากระบวนงานที่เก็บไว้ ให้พิจารณาการจัดเก็บตรรกะคิวรีของคุณที่นั่น และเรียกใช้ในคิวรี M อีกวิธีหนึ่งคือ ถ้ามี ให้ใช้กลไกการส่งผ่านพารามิเตอร์ที่สร้างขึ้นในภาษาและตัวเชื่อมต่อคิวรีต้นทาง ตัวอย่างเช่น Azure Data Explorer มีความสามารถของพารามิเตอร์คิวรีที่มีอยู่ภายในซึ่งออกแบบมาเพื่อป้องกันการโจมตีการฉีด

นี่คือตัวอย่างบางส่วนของการลดเหล่านี้:

  • ตัวอย่างที่ใช้การดําเนินการกรองของคิวรี M:

    Table.SelectRows(Source, (r) => r[Columns] = Parameter)
    
  • ตัวอย่างที่ตรวจนับพารามิเตอร์ในคิวรีต้นทาง หรือส่งผ่านค่าพารามิเตอร์เป็นข้อมูลป้อนเข้าไปยังฟังก์ชันคิวรีต้นทาง:

    declare query_parameters (Name of Parameter : Type of Parameter);
    
  • ตัวอย่างของการเรียกขั้นตอนการจัดเก็บโดยตรง:

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

ข้อควรพิจารณาและข้อจำกัด

มีข้อควรพิจารณาและข้อจํากัดบางอย่างเมื่อคุณใช้พารามิเตอร์คิวรี M แบบไดนามิก:

  • พารามิเตอร์เดียวไม่สามารถผูกกับหลายเขตข้อมูลหรือกลับกันได้
  • พารามิเตอร์คิวรี M แบบไดนามิกไม่สนับสนุนการรวม
  • พารามิเตอร์คิวรี M แบบไดนามิกไม่สนับสนุนการรักษาความปลอดภัยระดับแถว (RLS)
  • ชื่อพารามิเตอร์ไม่สามารถเป็นคําที่สงวนไว้ของนิพจน์การวิเคราะห์ข้อมูล (DAX) หรือมีช่องว่างได้ คุณสามารถผนวก Parameter เข้ากับส่วนท้ายของชื่อพารามิเตอร์เพื่อช่วยหลีกเลี่ยงข้อจํากัดนี้
  • ชื่อตารางต้องไม่ประกอบด้วยช่องว่างหรืออักขระพิเศษ
  • ถ้าพารามิเตอร์ของคุณเป็นDate/Timeชนิดข้อมูล คุณจะต้องแคสต์พารามิเตอร์ภายในคิวรี M เป็นDateTime.Date(<YourDateParameter>)
  • ถ้าคุณใช้แหล่งข้อมูล SQL คุณอาจได้รับกล่องโต้ตอบการยืนยันทุกครั้งที่ค่าพารามิเตอร์เปลี่ยนแปลง กล่องโต้ตอบนี้เกิดเนื่องจากการตั้งค่าความปลอดภัย: จําเป็นต้องมีการอนุมัติจากผู้ใช้สําหรับคิวรีฐานข้อมูลดั้งเดิมใหม่ คุณสามารถค้นหาและปิดการตั้งค่านี้ได้ในส่วนการรักษาความปลอดภัยของตัวเลือก Power BI Desktop
  • พารามิเตอร์คิวรี M แบบไดนามิกอาจไม่ทํางานเมื่อเข้าถึงแบบจําลองความหมายใน Excel
  • พารามิเตอร์คิวรี M แบบไดนามิกไม่ได้รับการสนับสนุนบนเซิร์ฟเวอร์รายงาน Power BI

ชนิดพารามิเตอร์ที่ไม่ได้รับการสนับสนุนในกล่อง

  • Any
  • ระยะเวลา
  • จริง/เท็จ
  • ไบนารี

ตัวกรองที่ไม่สนับสนุน

  • ตัวแบ่งส่วนหรือตัวกรองเวลาที่สัมพันธ์กัน
  • วันที่สัมพัทธ์
  • ตัวแบ่งส่วนลําดับชั้น
  • หลายเขตข้อมูลรวมตัวกรอง
  • ไม่รวมตัวกรอง/ไม่กรอง
  • การไฮไลต์เชื่อมโยง
  • ตัวกรองการดูรายละเอียดแนวลึก
  • ตัวกรองการเจาะข้าม
  • ตัวกรอง N อันดับแรก

การดําเนินการที่ไม่สนับสนุน

  • And
  • Contains
  • น้อยกว่า
  • มากกว่า
  • เริ่มต้นด้วย
  • ไม่ได้เริ่มต้นด้วย
  • ไม่ใช่
  • ไม่ประกอบด้วย
  • ว่างเปล่า
  • ไม่ว่างเปล่า

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถของ Power BI Desktop โปรดดูทรัพยากรต่อไปนี้: