<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>New blog articles in Microsoft Fabric Community</title>
    <link>https://community.fabric.microsoft.com/t5/</link>
    <description>Microsoft Fabric Community</description>
    <pubDate>Tue, 15 Sep 2026 11:44:27 GMT</pubDate>
    <dc:creator>Community</dc:creator>
    <dc:date>2026-09-15T11:44:27Z</dc:date>
    <item>
      <title>Grounding Fabric Data Agents so they stop inventing columns | Part-1</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/Grounding-Fabric-Data-Agents-so-they-stop-inventing-columns-Part/ba-p/5365593</link>
      <description>&lt;P&gt;Your data agent answers a question about churn by writing &lt;SPAN class="lia-text-color-13"&gt;SELECT customer_id, churn_flag FROM dim_customer&lt;/SPAN&gt;. There is no churn_flag column. There never was. The agent produced confident SQL against a column it made up, the query failed, and the person who asked has now decided the whole thing is a toy.&lt;/P&gt;
&lt;P&gt;This is the single most common complaint I see about Fabric data agents in the community, and almost every answer to it is the same: "add better AI instructions." That advice is not wrong, but it is the weakest lever available and people reach for it first.&lt;/P&gt;
&lt;P&gt;Here is the thing that changes how you approach the problem. &lt;STRONG&gt;An agent does not invent a column because it is disobedient. It invents a column because the question implied a concept that your schema does not name, and generating something plausible is the only move it has.&lt;/STRONG&gt; You cannot instruct your way out of that. You have to close the gap between the words your users use and the words your schema uses.&lt;/P&gt;
&lt;P&gt;So the fix is a stack, and it is worth being blunt about which layers actually carry weight:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;/th&gt;&lt;th&gt;Effort&lt;/th&gt;&lt;th&gt;How much it actually helps&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Shape the schema the agent sees&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;Most of the win&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scope tables and columns tightly&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Large&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Data source instructions and descriptions&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Example queries (few-shot)&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Moderate, and underused&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Agent instructions&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Small on its own&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Evaluation harness&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Not accuracy, but it is how you keep accuracy&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Most teams do this list backwards. Below is each layer with the actual configuration.&lt;/P&gt;
&lt;H2&gt;First, confirm it is actually hallucinating&lt;/H2&gt;
&lt;P&gt;Before you fix anything, find out what happened. Two different failures look identical from the chat window:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The agent referenced a column that does not exist.&lt;/LI&gt;
&lt;LI&gt;The agent referenced a real column that means something different from what the user assumed.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The second is far more common and far more dangerous, because it returns a number instead of an error. A status column that means &lt;EM&gt;shipment&lt;/EM&gt; status answering a question about &lt;EM&gt;payment&lt;/EM&gt; status will produce a clean, wrong answer that nobody catches for a quarter.&lt;/P&gt;
&lt;P&gt;Use the &lt;STRONG&gt;Diagnostics&lt;/STRONG&gt; button in the data agent. &amp;lt;cite index="47-1"&amp;gt;It downloads a snapshot of the agent's configuration and execution steps, including data source settings, the instructions that were applied, which example queries were used, and the steps the agent took to produce its response.&amp;lt;/cite&amp;gt; Read the generated SQL, not the answer. If you are debugging by reading answers, you are debugging the wrong artifact.&lt;/P&gt;
&lt;H2&gt;Layer 1: Shape what the agent can see&lt;/H2&gt;
&lt;P&gt;The agent reads your schema. If your schema is tbl_cust_mstr with columns flg1, dt_2, and amt_ttl, no instruction block will save you.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Build a view layer for the agent.&lt;/STRONG&gt; Do not point it at your raw tables. Create a schema of AI-facing views with names that match how people actually speak, and expose only those.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Fabric Warehouse (T-SQL). The agent sees this, not the underlying tables. CREATE SCHEMA ai; GO  CREATE VIEW ai.customer AS SELECT     c.cust_sk  AS customer_key,     c.cust_no  AS customer_number,     c.cust_nm AS customer_name,     g.ctry_cd AS country_code,     g.ctry_nm AS country_name,     c.seg_cd AS segment_code,     CASE c.seg_cd         WHEN 'E' THEN 'Enterprise'         WHEN 'M' THEN 'Mid-Market'         WHEN 'S' THEN 'Small Business'     END AS segment_name,     c.acq_dt AS acquisition_date,     CASE WHEN c.term_dt IS NOT NULL THEN 1 ELSE 0 END AS is_churned,     c.term_dt  AS churn_date,     c.act_flg AS is_active FROM dbo.dim_cust c LEFT JOIN dbo.dim_geo g ON g.geo_sk = c.geo_sk WHERE c.is_current = 1;   -- collapse SCD2 so the agent never has to reason about it GO&lt;/LI-CODE&gt;
&lt;P&gt;Four things happened there, and each one removes an entire class of hallucination:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;is_churned now exists.&lt;/STRONG&gt; The agent no longer has to invent it. This is the whole game. Every time you see a hallucinated column, ask whether it should be a real column.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Codes are decoded.&lt;/STRONG&gt; segment_name means the agent never has to guess that 'E' is Enterprise, and users can ask about "enterprise customers" in their own words.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;SCD2 is collapsed.&lt;/STRONG&gt; Slowly changing dimensions are a reliable source of silently wrong answers, because the agent has no reason to know it must filter to the current row.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Cryptic names are gone.&lt;/STRONG&gt; amt_ttl invites guessing; total_amount_usd does not.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If you cannot create views, at minimum use column descriptions on the tables you do expose. The SDK &amp;lt;cite index="41-1"&amp;gt;supports adding column and table descriptions for SQL data sources&amp;lt;/cite&amp;gt;, and they carry real weight in query generation.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Then scope hard.&lt;/STRONG&gt; &amp;lt;cite index="46-1"&amp;gt;A data agent supports up to five data sources, and for each one you select the specific tables the agent can use.&amp;lt;/cite&amp;gt; Select fewer than you think. Twelve well-described tables outperform sixty raw ones, every time. Ambiguity is the raw material of hallucination, and every table you add manufactures more of it.&lt;/P&gt;
&lt;P&gt;One trap specific to lakehouses: &amp;lt;cite index="46-1"&amp;gt;the agent answers using the lakehouse &lt;EM&gt;tables&lt;/EM&gt; you select and does not read standalone files such as CSV or JSON unless they are ingested or exposed as tables.&amp;lt;/cite&amp;gt; If your answer set lives in Files, the agent cannot see it, and it will improvise around the gap rather than tell you.&lt;/P&gt;
&lt;H2&gt;Layer 2: Data source instructions (per source, not global)&lt;/H2&gt;
&lt;P&gt;There are two distinct instruction fields and people conflate them constantly.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data source instructions&lt;/STRONG&gt; attach to a single data source and are used during query generation. &amp;lt;cite index="31-1"&amp;gt;They improve the agent's ability to select the right tables and columns, understand data-specific logic such as fiscal calendars and regional codes, apply consistent filters, and interpret intent.&amp;lt;/cite&amp;gt; This is where anti-hallucination content belongs, because it sits closest to the SQL being written.&lt;/P&gt;
&lt;P&gt;Here is a template. Replace the specifics; keep the structure.&lt;/P&gt;
&lt;LI-CODE lang=""&gt;SCOPE This source contains the ai.* views only. Every question about customers, subscriptions, invoices and revenue is answered from these views.  TABLE MAP ai.customer      – one row per current customer. Grain: customer_key. ai.subscription  – one row per subscription. Grain: subscription_key.                    A customer may hold several subscriptions. ai.invoice_line  – one row per invoice line. Grain: invoice_line_key.                    This is the only source of revenue. ai.date          – calendar and fiscal date dimension. Grain: date_key.  JOIN PATHS ai.subscription  -&amp;gt; ai.customer     on customer_key ai.invoice_line  -&amp;gt; ai.subscription on subscription_key Any table        -&amp;gt; ai.date         on date_key Never join ai.invoice_line directly to ai.customer. Go through ai.subscription, or revenue will be duplicated across subscriptions.  DEFINITIONS "Revenue"        = SUM(ai.invoice_line.net_amount_usd). Never gross_amount_usd. "Churn"          = ai.customer.is_churned = 1. "Active customer"= ai.customer.is_active = 1. "ARR"            = SUM(ai.subscription.annual_contract_value_usd)                    WHERE ai.subscription.status = 'Active'. "Enterprise"     = ai.customer.segment_name = 'Enterprise'.  TIME The fiscal year starts on 1 April. For any question mentioning a fiscal period, use ai.date.fiscal_year and ai.date.fiscal_quarter. For any question mentioning a calendar period or naming a year with no other qualifier, use ai.date.calendar_year. "Last month" means the most recent complete calendar month, not the trailing 30 days.  VALUE FORMATS country_code is a two-letter ISO code ('AE', 'SA', 'GB'), never a full country name. To filter on a country name, use country_name. segment_name is one of: Enterprise, Mid-Market, Small Business. All amounts are already in USD. Do not apply currency conversion.  CONSTRAINTS Use only the columns listed in the table map above. If a question requires a column or a concept that does not exist in these views, do not substitute a similar column and do not construct one. State which specific column would be needed and stop.&lt;/LI-CODE&gt;
&lt;P&gt;That last paragraph is the only genuinely instruction-shaped anti-hallucination content in the whole block, and it is the least important part of it. Everything above it works by &lt;EM&gt;removing the need to guess&lt;/EM&gt;. The constraint paragraph only catches what slipped through.&lt;/P&gt;
&lt;P&gt;Note the join warning. Fan-out across a one-to-many join is the most common cause of a plausible-but-doubled number, and it produces no error at all.&lt;/P&gt;
&lt;H2&gt;Layer 3: Agent instructions (routing and terminology)&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;Agent instructions&lt;/STRONG&gt; are global. &amp;lt;cite index="28-1"&amp;gt;You can write up to 15,000 characters of plain English to instruct the agent on how to handle queries, including which data source to use for which kind of question, and definitions for words, acronyms or terms the AI consistently misinterprets.&amp;lt;/cite&amp;gt; &amp;lt;cite index="46-1"&amp;gt;For example: direct financial metrics to a Power BI semantic model, raw data exploration to the lakehouse, and log analysis to the KQL database.&amp;lt;/cite&amp;gt;&lt;/P&gt;
&lt;P&gt;Keep this layer short and about routing. Detail belongs at the source level.&lt;/P&gt;
&lt;LI-CODE lang=""&gt;ROUTING Questions about revenue, ARR, bookings or any officially reported financial metric  -&amp;gt;  the "Finance Reporting" semantic model. These figures are governed and must match published reporting.  Questions about customer counts, subscription details, product usage or any exploratory or ad-hoc analysis  -&amp;gt;  the "CustomerLH" lakehouse.  Questions about system errors, latency, ingestion failures or anything described as logs, events or telemetry  -&amp;gt;  the "PlatformEvents" KQL database.  If a question spans finance and customer detail, answer the financial part from the semantic model and say explicitly which part came from which source.  ORGANISATIONAL TERMS "GCC"   = the countries AE, SA, KW, QA, BH, OM. "MENA"  = GCC plus EG, JO, LB, MA, TN. "NRR"   = net revenue retention. Only reported from the Finance Reporting           model; do not compute it from raw invoice data. "Logo"  = a customer account, not a brand asset. "Logo churn" means customer           count churn, not revenue churn.  BEHAVIOUR Always state which data source answered the question. When a question is ambiguous between two definitions, ask one clarifying question rather than picking one silently. Never present an estimate as a reported figure.&lt;/LI-CODE&gt;
&lt;P&gt;The terminology section earns its place. "Logo churn" is exactly the kind of phrase that sends an agent hunting for a column that does not exist.&lt;/P&gt;
&lt;P&gt;One boundary worth understanding: &amp;lt;cite index="46-1"&amp;gt;instructions sit in a precedence model beneath organisational policy and role-based permissions, and above end-user prompts. Where they conflict with policy, the agent refuses or redirects.&amp;lt;/cite&amp;gt; Your instructions configure behaviour; they do not grant access.&lt;/P&gt;
&lt;H2&gt;Layer 4: Example queries, which almost nobody uses properly&lt;/H2&gt;
&lt;P&gt;This is the most underused surface in the whole product. &amp;lt;cite index="46-1"&amp;gt;You can add sample question-and-query pairs that show the agent how to interpret similar questions&amp;lt;/cite&amp;gt;, and &amp;lt;cite index="46-1"&amp;gt;you get up to 100 per data source.&amp;lt;/cite&amp;gt; Most agents I look at have three.&lt;/P&gt;
&lt;P&gt;Few-shot examples do something instructions cannot: they demonstrate the join path, the filter convention, and the column vocabulary in the exact form the agent has to produce. An instruction saying "always join through subscription" is a claim. An example query showing it is a pattern.&lt;/P&gt;
&lt;P&gt;Pick your examples deliberately. Cover:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;The canonical join&lt;/STRONG&gt;, so the fan-out path is demonstrated rather than described.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The fiscal-versus-calendar distinction&lt;/STRONG&gt;, one example each.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The metric everyone asks for differently.&lt;/STRONG&gt; If revenue is asked as "sales", "turnover" and "top line", write one example per phrasing.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The concept your schema does not have.&lt;/STRONG&gt; More on this below.&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="sql"&gt;-- Q: What was our revenue in the GCC last fiscal quarter? SELECT     SUM(il.net_amount_usd) AS revenue_usd FROM ai.invoice_line il JOIN ai.subscription s ON s.subscription_key = il.subscription_key JOIN ai.customer     c ON c.customer_key     = s.customer_key JOIN ai.date         d ON d.date_key         = il.date_key WHERE c.country_code IN ('AE','SA','KW','QA','BH','OM')   AND d.fiscal_quarter = (         SELECT fiscal_quarter FROM ai.date WHERE date_key = CAST(GETDATE() AS DATE)       ) - 1;&lt;/LI-CODE&gt;&lt;LI-CODE lang="sql"&gt;-- Q: How many enterprise customers churned in calendar 2025? SELECT     COUNT(DISTINCT c.customer_key) AS churned_customers FROM ai.customer c JOIN ai.date d ON d.date_key = c.churn_date WHERE c.is_churned = 1   AND c.segment_name = 'Enterprise'   AND d.calendar_year = 2025;&lt;/LI-CODE&gt;
&lt;P&gt;One limitation to plan around: &amp;lt;cite index="46-1"&amp;gt;example query pairs are not currently supported for Power BI semantic model data sources.&amp;lt;/cite&amp;gt; If you route financial questions to a semantic model, that source gets instructions and a well-described model, and nothing else. Invest correspondingly more in the model's own metadata and measure descriptions.&lt;/P&gt;
&lt;P&gt;There is also a preview assistant that can help you generate this configuration. &amp;lt;cite index="27-1"&amp;gt;Build agent with AI mode summarises key entities, likely join paths and important columns, surfaces patterns from successfully executed queries in your query history, and proposes candidate few-shot examples and data source instructions.&amp;lt;/cite&amp;gt; &amp;lt;cite index="27-1"&amp;gt;It is currently limited to SQL and Eventhouse sources and will not run if you add an unsupported source.&amp;lt;/cite&amp;gt; Treat its output as a first draft you edit, not a configuration you accept.&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-13"&gt;&lt;STRONG&gt;Please check part-2 of this post&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 17:04:12 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/Grounding-Fabric-Data-Agents-so-they-stop-inventing-columns-Part/ba-p/5365593</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-14T17:04:12Z</dc:date>
    </item>
    <item>
      <title>Diagnose Fabric Data Warehouse workloads with the SQL DW operations skill (Generally Available)</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Diagnose-Fabric-Data-Warehouse-workloads-with-the-SQL-DW/ba-p/5366102</link>
      <description>&lt;P&gt;When a warehouse slows down, the investigation usually starts with more questions than answers. Was there a capacity spike? Did a specific query suddenly become expensive? Are requests failing, being canceled, or simply taking longer than usual?&lt;/P&gt;
&lt;P&gt;Answering those questions often requires switching between the Fabric Capacity Metrics app, Query Insights, and SQL pool diagnostics while manually correlating time ranges across multiple tools. The SQL DW operations skill brings those investigations into a single workflow and is now generally available.&lt;/P&gt;
&lt;P&gt;Available through the open-source &lt;A class="lia-external-url" href="https://github.com/microsoft/skills-for-fabric" target="_blank" rel="noopener"&gt;Microsoft Fabric skills repository&lt;/A&gt;, the SQL DW operations skill lets you describe a problem in natural language using a compatible AI coding tool such as GitHub Copilot CLI. The skill runs bounded, read-only diagnostics and returns a structured diagnosis, supporting evidence, recommended actions, and validation steps.&lt;/P&gt;
&lt;H2&gt;What you can do with the SQL DW operations skill&lt;/H2&gt;
&lt;P&gt;The SQL DW operations skill helps you:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;failure-analysis&lt;/STRONG&gt;: Separate failed queries from canceled requests, identify affected workloads, and resolve engine error codes.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;resource-consumers&lt;/STRONG&gt;: Find recurring resource-consuming query patterns, regressions, and changes in execution volume or per-run cost.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;capacity-metrics-correlation&lt;/STRONG&gt;: Connect a Capacity Metrics spike to warehouse activity in the same time window.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;pool-pressure&lt;/STRONG&gt;: Diagnose contention and identify workloads that might benefit from custom SQL pools.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;lakehouse-health&lt;/STRONG&gt;: Find lakehouse tables with small-file, deleted-row, or checkpoint issues.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;query-reference&lt;/STRONG&gt;: Use the appropriate read-only system views and Query Insights queries for bounded operational analysis.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;scenarios&lt;/STRONG&gt;: Combine the diagnostics into guided workflows for common warehouse incidents.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Each response separates the diagnosis, evidence, ruled-out causes, recommendations, and customer follow-ups. Measurements are tied to their source, and zero-row results are treated as valid evidence instead of prompting an invented explanation.&lt;/P&gt;
&lt;H2&gt;Common use cases&lt;/H2&gt;
&lt;P&gt;Start with the operational question rather than selecting system views or writing diagnostic SQL.&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;Figure: GIF depiction of how the SQL DW operations skill connects a natural-language prompt to bounded, read-only diagnostics and customer follow-up actions.&lt;/EM&gt;&lt;/img&gt;
&lt;H3&gt;Investigate failed and canceled queries&lt;/H3&gt;
&lt;P&gt;Analyze failed and canceled queries in SalesWarehouse during the last 24 hours.&lt;/P&gt;
&lt;P&gt;The skill uses Query Insights to identify affected users, applications, query patterns, and SQL pools. It resolves failed engine codes through sys.messages and keeps cancellations separate because they can reflect a user-initiated cancellation, a client timeout, or resource pressure.&lt;/P&gt;
&lt;H3&gt;Explain a performance slowdown&lt;/H3&gt;
&lt;P&gt;Explain why FinanceWarehouse was slow between 09:00 and 11:00 UTC yesterday.&lt;/P&gt;
&lt;P&gt;The skill checks SQL pool pressure, overlapping requests, CPU, elapsed time, and storage scans. It distinguishes contention from a directly expensive query or a broad increase in workload.&lt;/P&gt;
&lt;H3&gt;Find resource-consuming query patterns&lt;/H3&gt;
&lt;P&gt;Find the top resource-consuming queries in SalesWarehouse and compare them with the previous seven days.&lt;/P&gt;
&lt;P&gt;The skill groups requests by query shape and separates higher execution volume from increased per-run cost, new query patterns, and one-time expensive runs.&lt;/P&gt;
&lt;H3&gt;Investigate a capacity spike&lt;/H3&gt;
&lt;P&gt;Use the Fabric Capacity Metrics app to investigate the CU spike from 14:00 to 15:00 UTC, then identify expensive SQL users and query patterns.&lt;/P&gt;
&lt;P&gt;Following the warehouse metering update introduced in August 2026, Capacity Metrics shows when consumption occurred and how much was reported based on allocated warehouse compute over time. Query Insights explains what ran during the same period.&lt;/P&gt;
&lt;P&gt;The skill discovers the installed Capacity Metrics model, identifies a costly warehouse or SQL analytics endpoint, and analyzes Query Insights requests that overlap its time window. It doesn't join Capacity Metrics operation identifiers to Query Insights statement identifiers. Capacity consumption and warehouse CPU are complementary signals, not interchangeable measurements.&lt;/P&gt;
&lt;H3&gt;Assess custom SQL pool candidates&lt;/H3&gt;
&lt;P&gt;Assess whether recurring workloads in SalesWarehouse are candidates for custom SQL pools based on the last 30 days.&lt;/P&gt;
&lt;P&gt;If repeated pressure is associated with a consistent application name, such as an ingestion service or reporting application, the skill can recommend testing that workload in a custom SQL pool. It identifies the application to isolate and the pressure, latency, CPU, scan, and failure measures to compare before and after the pilot.&lt;/P&gt;
&lt;H2&gt;Get started&lt;/H2&gt;
&lt;H3&gt;Prerequisites&lt;/H3&gt;
&lt;P&gt;Before you start, make sure you have:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;GitHub Copilot CLI or another compatible AI coding tool.&lt;/LI&gt;
&lt;LI&gt;An active Fabric warehouse or lakehouse SQL analytics endpoint.&lt;/LI&gt;
&lt;LI&gt;Contributor or higher access to the workspace.&lt;/LI&gt;
&lt;LI&gt;The Microsoft Fabric Capacity Metrics app installed for capacity-spike investigations.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Add the Microsoft Fabric skills marketplace in GitHub Copilot CLI:&lt;/P&gt;
&lt;P&gt;/plugin marketplace add microsoft/skills-for-fabric&lt;/P&gt;
&lt;P&gt;Install the Fabric skills bundle:&lt;/P&gt;
&lt;P&gt;/plugin install fabric-skills@fabric-collection&lt;/P&gt;
&lt;P&gt;Then open Copilot CLI in a project folder and describe the warehouse issue you want to investigate. Include the workspace, warehouse or SQL analytics endpoint, and UTC time range when possible.&lt;/P&gt;
&lt;P&gt;For detailed permissions, setup, supported scenarios, and diagnostic time limits, see &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/skills-for-data-warehouse-operations" target="_blank" rel="noopener"&gt;Diagnose warehouse workloads with the SQL DW operations skill&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;Next Steps&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Install or update the &lt;A class="lia-external-url" href="https://github.com/microsoft/skills-for-fabric" target="_blank" rel="noopener"&gt;Microsoft Fabric skills bundle&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Review &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/query-insights" target="_blank" rel="noopener"&gt;Query Insights in Fabric Data Warehouse&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Review &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/monitoring-overview" target="_blank" rel="noopener"&gt;monitoring options for Fabric Data Warehouse&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Learn about &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/custom-sql-pools" target="_blank" rel="noopener"&gt;custom SQL pools&lt;/A&gt;.&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Mon, 14 Sep 2026 17:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Diagnose-Fabric-Data-Warehouse-workloads-with-the-SQL-DW/ba-p/5366102</guid>
      <dc:creator>Mariyaali</dc:creator>
      <dc:date>2026-09-14T17:00:00Z</dc:date>
    </item>
    <item>
      <title>From Business Events, Fabric Events, and Azure Events to Real-Time Hub</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/From-Business-Events-Fabric-Events-and-Azure-Events-to-Real-Time/ba-p/5365864</link>
      <description>&lt;P&gt;Welcome to the eighth and final post in our Business Events, Fabric Events, and Azure Events series for Microsoft Fabric. This series takes you from foundational event-driven concepts to practical implementation patterns that help teams turn meaningful business moments into trusted signals, decisions, and actions across Fabric.&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 16:59:28 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/From-Business-Events-Fabric-Events-and-Azure-Events-to-Real-Time/ba-p/5365864</guid>
      <dc:creator>robece-msft</dc:creator>
      <dc:date>2026-09-14T16:59:28Z</dc:date>
    </item>
    <item>
      <title>Forecasting with Autoregression, ARIMA &amp; AIC / BIC for Data Science in Microsoft Fabric</title>
      <link>https://community.fabric.microsoft.com/t5/Data-Science-Community-Blog/Forecasting-with-Autoregression-ARIMA-AIC-BIC-for-Data-Science/ba-p/4870627</link>
      <description>&lt;P&gt;In this edition, we’re exploring forecasting through Autoregression, ARIMA, and the model selection tools AIC and BIC. By the time you’re done reading, you’ll understand how data can actually learn from its own patterns, how ARIMA helps bring structure to unpredictable trends, and how AIC and BIC keep your models grounded by balancing accuracy with simplicity.&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 13:57:38 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Data-Science-Community-Blog/Forecasting-with-Autoregression-ARIMA-AIC-BIC-for-Data-Science/ba-p/4870627</guid>
      <dc:creator>Sahir_Maharaj</dc:creator>
      <dc:date>2026-09-14T13:57:38Z</dc:date>
    </item>
    <item>
      <title>How to Connect SAP to Power BI Through SAP BTP</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/How-to-Connect-SAP-to-Power-BI-Through-SAP-BTP/ba-p/5366349</link>
      <description>&lt;P&gt;Learn how to connect SAP to Power BI through SAP BTP using Metrica Software’s connector. This step-by-step guide covers creating reusable OData data sources, managing access, and loading SAP data into Power BI.&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 13:57:05 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/How-to-Connect-SAP-to-Power-BI-Through-SAP-BTP/ba-p/5366349</guid>
      <dc:creator>metrica</dc:creator>
      <dc:date>2026-09-14T13:57:05Z</dc:date>
    </item>
    <item>
      <title>Schema Compare in VS Code: Simplifying Fabric Warehouse Deployments</title>
      <link>https://community.fabric.microsoft.com/t5/Data-Warehouse-Community-Blog/Schema-Compare-in-VS-Code-Simplifying-Fabric-Warehouse/ba-p/5366300</link>
      <description>&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Deploying databases shouldn't feel uncertain. Synchronizing development and production schemas in Microsoft Fabric Warehouse can be challenging as database objects evolve. A frequent issue arises when the .sqlproj file isn't configured with the Fabric-specific schema provider (SqlDbFabricDatabaseSchemaProvider). Misconfiguration may lead Schema Compare to flag supported Fabric objects as unsupported. To avoid this issue, explicitly specify the schema provider in the .sqlproj XML if the GUI does not offer that option.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;In this blog, let's take a quick look at how to get started.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Before using Schema Compare with Fabric Warehouse, make sure you have the following prerequisites.&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-preserver-spaces="true"&gt;You need access to an existing&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;Warehouse item within a Microsoft Fabric workspace&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;, with &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;Contributor or higher permissions&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;You also need&amp;nbsp;&lt;STRONG style="color: rgb(50, 49, 48);"&gt;&lt;SPAN data-preserver-spaces="true"&gt;Visual Studio Code&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="color: rgb(50, 49, 48);" data-preserver-spaces="true"&gt; installed on your workstation.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Next, install the&amp;nbsp;&lt;STRONG style="color: rgb(50, 49, 48);"&gt;&lt;SPAN data-preserver-spaces="true"&gt;.NET SDK&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="color: rgb(50, 49, 48);" data-preserver-spaces="true"&gt;, which is required to build and publish database projects.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Finally, install these two Visual Studio Code extensions:&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;SQL Database Projects&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;SQL Server (mssql)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Both extensions are available directly from the Visual Studio Code Marketplace. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;After installing the extensions, open Visual Studio Code and select "Add Connection" to connect to Fabric Warehouse.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Enter the required server and authentication details, and complete the connection.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;After connecting, access the Warehouse directly in Visual Studio Code.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN data-preserver-spaces="true"&gt;Open Schema Compare&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Now navigate to &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;Database Projects&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt; in Visual Studio Code.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;You should see your available database projects and connections. Right-click the database project or connection and select "Schema Compare."&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Schema Compare gives you an object-level view of the differences between the source and target.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;You can compare schemas between:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN data-preserver-spaces="true"&gt;.dacpac files&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-preserver-spaces="true"&gt;Databases&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-preserver-spaces="true"&gt;SQL database projects&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Comparison results outline actions to align target with source.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Instead of treating the database as a single deployment unit, you can review individual changes and decide what should happen next.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;You can also selectively exclude actions from the comparison results when a particular change should not be deployed.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN data-preserver-spaces="true"&gt;Schema Compare with Fabric Warehouse&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Schema Compare's integration with Fabric Warehouse allows developers to identify differences in database objects before implementing changes.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN data-preserver-spaces="true"&gt;Database Projects and Git&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;The database project becomes the artifact under review in the PR, not a raw DDL diff — schema changes get the same scrutiny as application code, and the deployment pipeline consumes a validated project state rather than an ad-hoc script.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;Schema Compare exposes Fabric Warehouse DDL limitations before deployment, helping you &lt;/SPAN&gt;&lt;SPAN data-preserver-spaces="true"&gt;proactively address issues and maintain greater control over the deployment process.&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 13:55:53 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Data-Warehouse-Community-Blog/Schema-Compare-in-VS-Code-Simplifying-Fabric-Warehouse/ba-p/5366300</guid>
      <dc:creator>techies</dc:creator>
      <dc:date>2026-09-14T13:55:53Z</dc:date>
    </item>
    <item>
      <title>Power BI Smart Table Visual: Excel style Column Filtering, Dynamic Column Headers, Grouping Columns</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Power-BI-Smart-Table-Visual-Excel-style-Column-Filtering-Dynamic/ba-p/5366517</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;For a smoother reading experience with clearer screenshots and easy code copying, I suggest [reading this article on my website](https://www.techietips.co.in/articles/powerbi-managed-6500measures-smartly). It’s free, ad-free, distraction-free, and dedicated solely to sharing knowledge.&lt;/P&gt;
&lt;P&gt;The Table is the most commonly used visual in Power BI. Anyone who has spent years in Excel expects to click a header and filter that column. They expect related columns to sit under a common heading. The native table visual does none of this.&lt;/P&gt;
&lt;P&gt;There are grid visuals in the Microsoft visual app source that do. Most developers never get to use them, for two reasons that have nothing to do with the features. The good ones are licensed per developers or user, and that cost has to be justified to someone. The free ones are usually not Microsoft certified, which means an uncertified third party script is running inside your report, and that is a fair thing for a security team to say no to.&lt;/P&gt;
&lt;P&gt;So I built one. It is called Smart Table, and I built it with Claude. This post walks through what it does.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1. Excel style column filtering&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Every column header carries a funnel button in its own divided cell. Click it and you get what you would expect from Excel: sort, a set of conditions appropriate to the column’s type, and a searchable checkbox list of that column’s values. The menu names the column it belongs to, counts what you have ticked, and stays open while you sort.&lt;/P&gt;
&lt;P&gt;The conditions follow the column type rather than offering one generic list:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Sync: does the filter stay in the grid or reach the report&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Sync is on by default. Filters applied in the header are pushed to the model, so every other visual on the page responds, exactly as if the user had used a slicer. Turn Sync off: Filtering then narrows this grid only.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;Global search&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The toolbar has a search box with its own operator dropdown: contains, is exactly, starts with, ends with, does not contain. It searches across every column at once.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.youtube.com/watch?v=biYBDeVU8xw" target="_blank"&gt;Power BI: Smart Table Excel Style Column Filtering&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. Dynamic column headers, driven by a measure&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;A column header name is normally a static label. Here it can be a DAX measure.&lt;/P&gt;
&lt;P&gt;Arrival Month is set to April, and the Key Metrics headers read Lead Time (Avg: 30.00), Room Nights (Avg: 1.00), ADR (Avg: 160.50). Change the month and they recompute.&lt;/P&gt;
&lt;P&gt;The header honors the filter context, including the filters applied inside the grid itself. Filter Property down to Resort Hotel with the funnel and the averages in the header follow.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.youtube.com/watch?v=CRxdEWsqfzs" target="_blank"&gt;Power BI Smart Table: Measure Driven Column Headers (Dynamic Column names) - YouTube&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. Column groups, without any extra tables&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Four groups across eleven columns: Reservation, Channel, Room Type, Key Metrics. Each one is a spanning header above its columns with its own colour.&lt;/P&gt;
&lt;P&gt;The thing to notice is what is not involved. No disconnected table. No field parameters. No two table visuals stacked on top of each other. No shapes placed in the background: which means your column groups move to the right along with your cursor.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.youtube.com/watch?v=xFi8LUcKWig" target="_blank"&gt;Power BI Smart Table: Grouping columns in a table without using a static table and a matrix visual - YouTube&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Known limits&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;All of these come down to one idea: some filtering reaches the model and some is local to the grid.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;30,000 rows That is the Power BI cap for a table mapping with this data reduction algorithm. Header filters push a real model filter, so filtering down to a workable set works fine. Do not point it at an unfiltered fact table.&lt;/LI&gt;
&lt;LI&gt;Value lists cap at 2,000 distinct values per column**, built from the loaded rows. On a high cardinality column like a guest name, use the search box in the menu.&lt;/LI&gt;
&lt;LI&gt;Ends with, Does not end with, and blank selections filter the grid only.** Power BI’s advanced filter operators have `StartsWith` and `Contains` but no `EndsWith`, and a blank has no equivalent in a model side `In` list. The menu tells you when you pick one of these.&lt;/LI&gt;
&lt;LI&gt;Bookmarks restore the data but not the ticked checkboxes.** The model filter is persisted by Power BI, so the rows come back correctly. The header checkboxes just will not show as ticked.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;I wrote this to make one point: the gaps in the built-in visuals are not permanent. Build your own, and with vibe coding that is no longer a months-long project.&lt;/P&gt;
&lt;P&gt;I am not sharing the .pbiviz file. It is an experiment, not tested for production grade reports. Feel free to checkout my [website](https://www.techietips.co.in) and reach out to me if you are interested to do these experiments along with me,&lt;/P&gt;
&lt;P&gt;I would like to continue developing this visual and will write detailed blogs in features explaining its features and implementations.&lt;/P&gt;
&lt;P&gt;I hope you learned something new. Feel free to share your thoughts in the comments section.&lt;/P&gt;
&lt;P&gt;Happy Learning!!!&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 13:55:10 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Power-BI-Smart-Table-Visual-Excel-style-Column-Filtering-Dynamic/ba-p/5366517</guid>
      <dc:creator>tharunkumarRTK</dc:creator>
      <dc:date>2026-09-14T13:55:10Z</dc:date>
    </item>
    <item>
      <title>My button &amp; slicer disappeared in Power BI Service. Here's why.</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/My-button-slicer-disappeared-in-Power-BI-Service-Here-s-why/ba-p/5366075</link>
      <description>&lt;P&gt;Imagine you have created a beautiful table in Power BI with a slicer and a button placed on top of it, overlapping the table area.&lt;/P&gt;
&lt;P&gt;The slicer is used to search for specific content. The button becomes clickable when exactly one row is selected and opens a detail page for that row.&lt;/P&gt;
&lt;P&gt;In Power BI Desktop, everything works perfectly.&lt;/P&gt;
&lt;P&gt;However, as soon as you publish your report to the Power BI service and start interacting with it, strange things may happen.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;If you select one row, both the slicer and the button disappear.&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;If you leave the table area, both reappear.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;However, as soon as you hover over them, they disappear again.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Even more strangely, if you move in and out of the table a few times, it may happen that the button is available again.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;As it turns out, this is documented behaviour, not a bug. In reading view, Power BI brings the selected visual to the front layer, above anything that overlaps it. Selecting a table row selects the table, so the button and the slicer, which actually sit in front of the table, end up behind it and disappear.&lt;/P&gt;
&lt;P&gt;What I can't explain is the button becoming available again after moving in and out a few times. I haven't found anything documented on that.&lt;/P&gt;
&lt;P&gt;The good news: this default behaviour can be changed.&lt;/P&gt;
&lt;P&gt;To change it, there is an option. It's called 'Maintain layer order' and can be found in a visuals format pane under Properties &amp;gt; Advanced options.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Switch it on for the visual that jumps to the front, in my case the table.&lt;/P&gt;
&lt;P&gt;Have you run into this one? And on which visual did you end up switching it on?&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 21:28:14 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/My-button-slicer-disappeared-in-Power-BI-Service-Here-s-why/ba-p/5366075</guid>
      <dc:creator>Hans-Georg_Puls</dc:creator>
      <dc:date>2026-09-10T21:28:14Z</dc:date>
    </item>
    <item>
      <title>Ask vs. Act: Fabric Data Agents and Fabric Operations Agents Explained (with Industry Scenarios)</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Ask-vs-Act-Fabric-Data-Agents-and-Fabric-Operations-Agents/ba-p/5366083</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Feature status (September 2026):&lt;/STRONG&gt; Fabric data agents and operations agents are both generally available. Investigator insights in operations agents is still in preview. Always check Microsoft Learn for the latest.&lt;/P&gt;
&lt;H2&gt;The core difference in one line&lt;/H2&gt;
&lt;P&gt;A &lt;STRONG&gt;Fabric data agent&lt;/STRONG&gt; waits for a question and answers it from governed data. A &lt;STRONG&gt;Fabric operations agent&lt;/STRONG&gt; doesn't wait for anyone: it continuously watches live data against business goals and raises its hand, or triggers an action, when a condition is met.&lt;/P&gt;
&lt;P&gt;A simple mental model: the data agent is the expert analyst you can message at any time; the operations agent is the control-room operator who never goes off shift.&lt;/P&gt;
&lt;H2&gt;Fabric data agent: conversational analytics on governed data&lt;/H2&gt;
&lt;P&gt;The data agent is a configurable Fabric item that lets anyone ask plain-English questions about data in OneLake. Behind the scenes, it decides which source can answer the question, then generates and runs a read-only query: SQL for lakehouses and warehouses, DAX for Power BI semantic models, and KQL for KQL databases (including Eventhouse). It can also work with ontologies and Microsoft Graph.&lt;/P&gt;
&lt;P&gt;One data agent can combine up to five sources. Authors improve accuracy by selecting relevant tables, writing agent instructions in business language (for example, "route revenue questions to the Finance semantic model"), and adding example question-and-query pairs, up to 100 per source (examples aren't currently supported for semantic models).&lt;/P&gt;
&lt;P&gt;Security is where the data agent is deliberately conservative. Every query runs with the &lt;STRONG&gt;asking user's own credentials&lt;/STRONG&gt;, so row-level and column-level security still apply, and Microsoft Purview controls such as DLP and access restriction policies are respected. It never creates, updates, or deletes data, and it doesn't trigger notebooks or other workflows.&lt;/P&gt;
&lt;P&gt;Once published, the agent can be consumed well beyond Fabric: in Microsoft 365 Copilot, Teams, Azure AI Foundry, or as a tool inside Microsoft Copilot Studio agents, where the integration is now generally available through the Fabric IQ Data MCP tool.&lt;/P&gt;
&lt;P&gt;It's built for conversational insight, not bulk extraction: responses are capped at 25 rows and 25 columns, and unstructured files like PDFs aren't supported.&lt;/P&gt;
&lt;H2&gt;Fabric operations agent: autonomous monitoring with human-in-the-loop action&lt;/H2&gt;
&lt;P&gt;The operations agent lives in the &lt;STRONG&gt;Real-Time Intelligence&lt;/STRONG&gt; workload. Instead of answering ad-hoc questions, you give it business goals, instructions, a knowledge source (an Eventhouse KQL database or an ontology), and the actions it's allowed to recommend.&lt;/P&gt;
&lt;P&gt;From that configuration, the agent generates a &lt;STRONG&gt;playbook&lt;/STRONG&gt;: the business entities and properties it will track and the rules that define what "needs attention" looks like. You can build this manually or describe your intent to the built-in Copilot chat ("monitor the turbines and alert me when motor temperature gets too high") and refine the proposed rules iteratively. Each rule is backed by an inspectable query that the agent evaluates every five minutes, using either &lt;STRONG&gt;state conditions&lt;/STRONG&gt; (such as &lt;EM&gt;is above&lt;/EM&gt; 80, which keeps signaling while true) or &lt;STRONG&gt;transition conditions&lt;/STRONG&gt; (such as &lt;EM&gt;crosses above&lt;/EM&gt; 80, which signals only on the change).&lt;/P&gt;
&lt;P&gt;When a rule is met, the agent sends a Teams message, to a person or a channel, through the Fabric Operations Agent Teams app, summarizing what it saw and what it recommends. Beyond messaging, you can configure actions that run a Fabric notebook or trigger a Power Automate flow, which opens the door to ServiceNow tickets, SAP work orders, emails, or any other Power Automate connector. For anomalies, Investigator insights (preview) adds correlated patterns and a likely root-cause summary directly in Teams.&lt;/P&gt;
&lt;P&gt;Two governance details matter. First, each operations agent gets its own &lt;STRONG&gt;Microsoft Entra Agent ID&lt;/STRONG&gt;, so its activity is auditable separately from human users. Second, it runs in delegated mode with its &lt;STRONG&gt;creator's permissions&lt;/STRONG&gt;: when a recipient approves a recommendation, the action executes with the creator's access. Choose agent owners deliberately.&lt;/P&gt;
&lt;H2&gt;Side-by-side comparison&lt;/H2&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Dimension&lt;/th&gt;&lt;th&gt;Fabric data agent&lt;/th&gt;&lt;th&gt;Fabric operations agent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Core purpose&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Answer questions about data&lt;/td&gt;&lt;td&gt;Monitor data and drive action&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Interaction model&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Pull: a user asks&lt;/td&gt;&lt;td&gt;Push: the agent notifies&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Trigger&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;A human prompt&lt;/td&gt;&lt;td&gt;A rule condition being met&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Data sources&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Lakehouse, warehouse, semantic model, KQL database, mirrored database, ontology, Microsoft Graph (up to 5)&lt;/td&gt;&lt;td&gt;Eventhouse KQL database or ontology&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Configuration&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Tables, instructions, example queries&lt;/td&gt;&lt;td&gt;Goals, instructions, playbook rules, actions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Output&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Natural-language answers, small tables, summaries&lt;/td&gt;&lt;td&gt;Teams alerts with recommendations, notebook runs, Power Automate flows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Write / action capability&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Strictly read-only&lt;/td&gt;&lt;td&gt;Executes approved actions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Identity&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Asking user's credentials (RLS/CLS enforced)&lt;/td&gt;&lt;td&gt;Entra Agent ID using creator's delegated permissions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Time orientation&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;"What happened, and why?"&lt;/td&gt;&lt;td&gt;"What's happening now, and what should we do?"&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Where users meet it&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Fabric, Teams, M365 Copilot, Copilot Studio, Foundry&lt;/td&gt;&lt;td&gt;Primarily Teams (alerts, approvals, investigations)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;Industry scenarios&lt;/H2&gt;
&lt;H3&gt;1. Manufacturing: from vibration spike to work order&lt;/H3&gt;
&lt;P&gt;A discrete manufacturer streams CNC machine telemetry (spindle vibration, motor temperature, cycle time) through Eventstream into an Eventhouse.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; Its goal is to minimize unplanned downtime. A rule watches for vibration crossing above tolerance on any machine. When it fires, the maintenance supervisors' Teams channel receives an alert with the machine, recent readings, and a recommendation to schedule an inspection. On approval, a Power Automate flow creates a work order in the maintenance system.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; Preparing for a quarterly review, the plant manager asks: &lt;EM&gt;"Which lines had the most unplanned downtime last quarter, and how did OEE compare to target?"&lt;/EM&gt; The agent queries the production lakehouse and OEE semantic model and returns a ranked answer, with no report-building required.&lt;/P&gt;
&lt;H3&gt;2. Retail and CPG: protecting a flash promotion&lt;/H3&gt;
&lt;P&gt;During a weekend promotion, point-of-sale and inventory events land in Eventhouse in near real time.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; It monitors store-level inventory for promoted SKUs and flags any item dropping below safety stock. The regional replenishment lead gets a Teams recommendation to trigger an emergency transfer from a nearby store or distribution center, executed through Power Automate after approval.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; On Monday, the category manager asks: &lt;EM&gt;"How did the promotion perform versus the same weekend last year, by region, and which stores ran out of stock?"&lt;/EM&gt; The agent blends the sales semantic model with lakehouse inventory history to answer in seconds.&lt;/P&gt;
&lt;H3&gt;3. Energy and utilities: pipeline pressure and grid load&lt;/H3&gt;
&lt;P&gt;An oil and gas operator ingests SCADA readings (pressure, flow rate, compressor status) from field assets; a utility does the same for substations.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; Rules detect pressure exiting its normal operating range at a pumping station, or transformer load crossing a critical threshold during a heatwave. The control room is alerted with context and a recommended response, such as dispatching a field technician via a flow. Human approval stays in the loop. Note that operations agents complement, and never replace, certified safety instrumented systems.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; An asset integrity engineer asks: &lt;EM&gt;"Which ten assets had the most pressure excursions in the last 12 months, and when were they last serviced?"&lt;/EM&gt;&lt;/P&gt;
&lt;H3&gt;4. Financial services: payment gateway degradation&lt;/H3&gt;
&lt;P&gt;A bank streams card authorization events by gateway, merchant category, and channel.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; Its goal is protecting payment success rates. When a gateway's decline rate crosses above its threshold, the payments operations team gets an alert with a breakdown and a recommendation to reroute traffic to a secondary processor, an action that runs only after an engineer approves it.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; A relationship manager asks: &lt;EM&gt;"Which of my corporate clients saw failed payments above 2% this month?"&lt;/EM&gt; Because the agent runs under the manager's own identity, row-level security ensures they only see their own portfolio.&lt;/P&gt;
&lt;H3&gt;5. Pharma logistics: cold-chain integrity&lt;/H3&gt;
&lt;P&gt;A logistics provider moving vaccines and biologics collects IoT temperature and GPS data from refrigerated containers.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; A transition rule fires the moment a shipment's temperature exits the 2–8°C range. The control tower is notified with location and excursion details, a notebook action flags the batch for quality review, and a flow alerts the receiving site.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; A quality lead asks: &lt;EM&gt;"Which lanes and carriers had the highest excursion rates this year?"&lt;/EM&gt;&lt;/P&gt;
&lt;H2&gt;Better together: detect, decide, explain&lt;/H2&gt;
&lt;P&gt;The strongest architectures use both agents on the same data foundation. Picture an airport operations team. An operations agent watches baggage-system events in Eventhouse and alerts the duty manager when belt throughput drops below target during a peak arrival wave. The manager approves the recommended action: rerouting bags to an alternate belt via Power Automate.&lt;/P&gt;
&lt;P&gt;Then, without leaving Teams, the manager asks a Copilot Studio agent grounded by a Fabric data agent over the same Eventhouse and historical lakehouse: &lt;EM&gt;"How often has this belt degraded at this time of day over the past 90 days?"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The operations agent handles &lt;STRONG&gt;detection and response&lt;/STRONG&gt;. The data agent handles &lt;STRONG&gt;explanation and learning&lt;/STRONG&gt;. Because both point at the same governed data in OneLake, the alert and the analysis never disagree about the numbers.&lt;/P&gt;
&lt;H2&gt;How to choose&lt;/H2&gt;
&lt;P&gt;Choose a &lt;STRONG&gt;data agent&lt;/STRONG&gt; when the need is exploratory and question-driven: executive self-service, analyst acceleration, or bringing trusted data into Copilot experiences. Choose an &lt;STRONG&gt;operations agent&lt;/STRONG&gt; when you have a specific, repeatable business process with measurable conditions, where minutes matter and someone should be told (or something should happen) without anyone having to ask.&lt;/P&gt;
&lt;P&gt;A quick test: if you hear &lt;EM&gt;"someone should check this dashboard every hour,"&lt;/EM&gt; you need an operations agent. If you hear &lt;EM&gt;"I just need to know X before Friday's meeting,"&lt;/EM&gt; you need a data agent.&lt;/P&gt;
&lt;H2&gt;Practical tips before you build&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;For data agents:&lt;/STRONG&gt; curate tightly by selecting only the tables users need, write instructions in business terms, and invest in example queries, which are often the biggest accuracy lever. Use Git integration and deployment pipelines to promote agents from development to production.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;For operations agents:&lt;/STRONG&gt; scope one agent to one business process, flatten nested JSON columns in Eventhouse tables before configuring, and review each rule's generated query before starting the agent. Remember that approvals execute with the creator's permissions, trial capacities aren't supported, and agents consume capacity units, so track them in the Fabric Capacity Metrics app.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;For both:&lt;/STRONG&gt; confirm your tenant admin has enabled the required Copilot and Azure OpenAI settings, including cross-geo AI processing where your capacity region requires it.&lt;/P&gt;
&lt;H2&gt;Wrapping up&lt;/H2&gt;
&lt;P&gt;Fabric data agents and operations agents are two sides of the same coin. The data agent democratizes &lt;STRONG&gt;understanding&lt;/STRONG&gt;: anyone can ask a question and get a governed answer. The operations agent operationalizes &lt;STRONG&gt;response&lt;/STRONG&gt;: the business stops depending on people watching dashboards and starts reacting to events as they happen.&lt;/P&gt;
&lt;P&gt;Start with the scenario that hurts most today, build on a shared OneLake foundation, and grow from there.&lt;/P&gt;
&lt;P&gt;How are you using these agents in your industry? Share your scenarios in the comments!&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 21:26:37 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Ask-vs-Act-Fabric-Data-Agents-and-Fabric-Operations-Agents/ba-p/5366083</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-10T21:26:37Z</dc:date>
    </item>
    <item>
      <title>Lineage-aware AI with the Fabric item relations API (Preview)</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Lineage-aware-AI-with-the-Fabric-item-relations-API-Preview/ba-p/5366064</link>
      <description>&lt;P&gt;With two new REST operations, you can retrieve the upstream and downstream relations of any Fabric item directly from your own code — the dependency graph behind the portal's lineage view, now available as a supported, programmable surface. Each response includes related items, the typed relation edges that connect them, and the workspaces those items belong to.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Lineage has always answered two human questions: “where does this data come from?” and “what breaks if I change it?” This API lets your tools — and your AI agents — ask those same questions programmatically.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;What’s new&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;Until now, item lineage in Fabric was something you explored visually in the portal. You opened an item, looked at its lineage view, and traced dependencies by eye.&amp;nbsp;That’s&amp;nbsp;great for people, but&amp;nbsp;it’s&amp;nbsp;difficult&amp;nbsp;to automate.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;With this update, lineage becomes an API. After authenticating to Fabric, you can programmatically:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Get the&amp;nbsp;downstream&amp;nbsp;relations of an item — everything that depends on it (its consumers and impact radius).&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Get the&amp;nbsp;upstream&amp;nbsp;relations of an item — everything it depends on (its sources).&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Read the typed&amp;nbsp;relation&amp;nbsp;edges between items (for example,&amp;nbsp;Shortcut,&amp;nbsp;PushData,&amp;nbsp;Orchestration).&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Resolve related items across workspaces, using the workspace list returned alongside the graph.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Feed lineage into impact analysis, documentation, data catalogs, CI/CD checks, and AI agents.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Why this matters&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;If you only work in the Fabric portal, the lineage view already serves you well. The impact of this update&amp;nbsp;shows up&amp;nbsp;once you need to automate or scale — when understanding dependencies becomes part of a workflow rather than a manual click-through. A few examples:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Before you&amp;nbsp;delete&amp;nbsp;or reroute a dataset, you call the&amp;nbsp;downstream&amp;nbsp;API to see every report, semantic model, and pipeline that would be affected.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;You build an internal catalog or documentation site that shows each item’s sources and consumers, kept fresh automatically.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;You add a CI/CD check that fails&amp;nbsp;a deployment&amp;nbsp;if a change would&amp;nbsp;break&amp;nbsp;a downstream dependency.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;You are an ISV building on Fabric, and you want lineage to be part of your product experience — not a side trip into the portal.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;That’s what a public API is for: turning a visual experience into a building block you can automate and compose.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Lineage is context for AI&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;AI agents are only as good as the context they are given. When an agent answers a question about a table, a report, or a metric, it benefits enormously from knowing where that data came from and what depends on it. Lineage is exactly that context.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;With the relations API, an agent can traverse an item’s dependency graph as part of its reasoning. Ask&amp;nbsp;“is it safe to change this table?”&amp;nbsp;and the agent can call the downstream API,&amp;nbsp;enumerate&amp;nbsp;the affected items, and ground its answer in the real graph instead of guessing. Ask&amp;nbsp;“where does this number come from?”&amp;nbsp;and it can walk upstream to the source.&amp;nbsp;In other words, lineage helps ground AI responses in the actual dependency graph rather than inferred relationships.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is the same pattern we see across Fabric’s AI story: take governance metadata your organization already&amp;nbsp;maintains&amp;nbsp;— like&amp;nbsp;&lt;A href="https://learn.microsoft.com/fabric/fundamentals/apply-sensitivity-labels" target="_blank" rel="noopener"&gt;sensitivity labels&lt;/A&gt; — and share it with AI so agents understand your data the way your organization does. Lineage joins that toolkit. It gives agents&amp;nbsp;dependency awareness: the ability to reason&amp;nbsp;about&amp;nbsp;cause, effect, and blast radius, not just content.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;How it works&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;At&amp;nbsp;a high level, the API exposes both sides of the dependency graph: what an item depends on and what depends on it.&amp;nbsp;The API adds two&amp;nbsp;GET&amp;nbsp;operations under the platform surface. Because the&amp;nbsp;API&amp;nbsp;is in&amp;nbsp;preview, every call&amp;nbsp;currently requires&amp;nbsp;beta=true&amp;nbsp;as a query parameter.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;GET /v1/workspaces/{workspaceId}/items/{itemId}/relations/downstream?beta=true&amp;nbsp;&lt;/P&gt;
&lt;P&gt;GET /v1/workspaces/{workspaceId}/items/{itemId}/relations/upstream?beta=true&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The caller needs&amp;nbsp;read&amp;nbsp;permission on the item.&amp;nbsp;Both user and service principal identities are supported.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Each response is a small graph made of three lists:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;items — every item in the returned graph, including the item you queried, so each relation endpoint can be resolved (id, type, display name, and the workspace they belong to).&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;relations — the edges, each with a source item, the item it depends on, and a relation type.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;workspaces — the workspaces referenced by those items, so you can resolve names across workspace boundaries.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A downstream response for a semantic model consumed by a report looks like this:&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;{&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "items": [&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ "id": "3546052c-...", "type": "Report",&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "displayName": "Q4 Sales Dashboard", "workspaceId": "cfafbeb1-..." },&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ "id": "9b218778-...", "type": "SemanticModel",&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "displayName": "Sales Semantic Model", "workspaceId": "cfafbeb1-..." }&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; ],&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "relations": [&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ "itemId": "3546052c-...",&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "dependentOnItemId": "9b218778-...",&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "relationType": "Association" }&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; ],&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "workspaces": [&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ "id": "cfafbeb1-...", "displayName": "Finance Analytics Workspace" }&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; ]&amp;nbsp;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The relation types describe&amp;nbsp;how&amp;nbsp;two items are connected. The set is extensible, so new types can be added over time:&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; height: 525px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 35px;"&gt;&lt;td style="height: 35px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Relation type&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 35px;"&gt;
&lt;P&gt;&lt;STRONG&gt;What it means&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 71px;"&gt;&lt;td style="height: 71px;"&gt;
&lt;P&gt;Association&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 71px;"&gt;
&lt;P&gt;The item consumes the dependency item — for example, a report built on a semantic model.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;Shortcut&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;The item references data through a OneLake shortcut to another item.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 47px;"&gt;&lt;td style="height: 47px;"&gt;
&lt;P&gt;PushData&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 47px;"&gt;
&lt;P&gt;The item writes or pushes data into the dependency item.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;Orchestration&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;The item runs or manages execution of the dependency item (for example, a pipeline).&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 71px;"&gt;&lt;td style="height: 71px;"&gt;
&lt;P&gt;Datasource&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 71px;"&gt;
&lt;P&gt;The item reads from the dependency item as a data source — for example, a notebook reading a&amp;nbsp;lakehouse.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;CascadeDelete&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;A parent–child relationship;&amp;nbsp;deleting&amp;nbsp;the parent&amp;nbsp;deletes&amp;nbsp;the dependent.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;WeakAssociation&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;A soft dependency that is removed if the dependent item is&amp;nbsp;deleted.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 65px;"&gt;&lt;td style="height: 65px;"&gt;
&lt;P&gt;HiddenInWorkspace&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 65px;"&gt;
&lt;P&gt;A dependency on an item that&amp;nbsp;isn't&amp;nbsp;surfaced in the workspace list, such as a staging artifact.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 27.6367%" /&gt;&lt;col style="width: 72.3633%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;Getting started&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;A great first step is to&amp;nbsp;pick&amp;nbsp;a familiar&amp;nbsp;item and&amp;nbsp;explore&amp;nbsp;its downstream relations to&amp;nbsp;understand&amp;nbsp;its impact radius.&amp;nbsp;The following&amp;nbsp;is the shape of a first call using the Azure CLI for authentication:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1. Authenticate to Fabric and get a token.&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;$token =&amp;nbsp;az&amp;nbsp;account get-access-token&amp;nbsp;`&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; --resource "https://api.fabric.microsoft.com"&amp;nbsp;`&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; --query accessToken -o tsv&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;2. Call the downstream relations API for an item.&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;GET https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /items/{itemId}/relations/downstream?beta=true&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Authorization: Bearer $token&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;3. Read the relations array to list what depends on the item, then walk upstream from any related item to trace it back to its sources.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;From there, wire the results into whatever needs dependency awareness — an impact-analysis check, a catalog page, or an AI agent’s context. You can find the operations in the&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/" target="_blank" rel="noopener"&gt;Fabric REST API reference&lt;/A&gt; under the platform items surface:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/items/get-downstream-relations(beta)?tabs=HTTP" target="_blank" rel="noopener"&gt;Items - Get Downstream Relations (beta) - REST API (Core) | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/items/get-upstream-relations(beta)?tabs=HTTP" target="_blank" rel="noopener"&gt;Items - Get Upstream Relations (beta) - REST API (Core) | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Exposing item lineage as a programmable API is a foundational step. It turns the dependency graph into something your tools, pipelines, and agents can read and reason over.&amp;nbsp;We look forward to seeing what you build with it.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note: This API is in preview and provided for evaluation and development purposes. It may change based on feedback and is not recommended for production use.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 19:10:20 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Lineage-aware-AI-with-the-Fabric-item-relations-API-Preview/ba-p/5366064</guid>
      <dc:creator>yaronc</dc:creator>
      <dc:date>2026-09-10T19:10:20Z</dc:date>
    </item>
    <item>
      <title>Designing scalable Business Events in Microsoft Fabric</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Designing-scalable-Business-Events-in-Microsoft-Fabric/ba-p/5365863</link>
      <description>&lt;P&gt;Welcome to the seventh post in our Business Events, Fabric Events, and Azure Events series for Microsoft Fabric. This series takes you from foundational event-driven concepts to practical implementation patterns that help teams turn meaningful business moments into trusted signals, decisions, and actions across Fabric.&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 16:59:09 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Designing-scalable-Business-Events-in-Microsoft-Fabric/ba-p/5365863</guid>
      <dc:creator>robece-msft</dc:creator>
      <dc:date>2026-09-14T16:59:09Z</dc:date>
    </item>
    <item>
      <title>Accelerate JSON workloads with the Native Execution Engine in Microsoft Fabric</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Accelerate-JSON-workloads-with-the-Native-Execution-Engine-in/ba-p/5364366</link>
      <description>&lt;P&gt;JSON is one of the most common formats in modern data platforms. It carries application events, API payloads, operational telemetry, configuration data, and the metadata that coordinates data-driven processes. For many organizations, JSON is not an edge case. It is part of the critical path from ingestion through transformation and analytics.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The update of&amp;nbsp;JSON support in the Microsoft Fabric Spark Native Execution Engine, now in&amp;nbsp;preview,&amp;nbsp;expands native acceleration to an important class of semi-structured workloads. Spark can now read and process JSON data through the Native Execution Engine's vectorized C++ path, helping more of the query remain columnar from the source through downstream transformations.&amp;nbsp;&lt;/P&gt;&lt;H4&gt;Why JSON performance matters&amp;nbsp;&lt;/H4&gt;&lt;P&gt;Analytics systems increasingly combine structured tables with semi-structured data. A pipeline might ingest JSON events from an application, use JSON control files to&amp;nbsp;determine&amp;nbsp;which tables to process, enrich the records with&amp;nbsp;lakehouse&amp;nbsp;data, and write curated Delta tables for reporting. JSON also appears behind the scenes in transaction metadata and other dependencies around Delta&amp;nbsp;Lake&amp;nbsp;processing.&amp;nbsp;&lt;/P&gt;&lt;P&gt;These patterns make JSON parsing more than a file-read operation. It can influence the startup time, throughput, and end-to-end efficiency of an entire job. When a pipeline runs&amp;nbsp;frequently&amp;nbsp;or processes many files, even small costs in parsing and data conversion can accumulate across stages and workloads.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Common customer scenarios include:&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Ingesting application, device, web, and service telemetry.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Processing nested records from APIs and partner data exchanges.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Driving reusable pipelines with JSON configuration and control files.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Reading schema, manifest, and metadata files during orchestration.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Transforming semi-structured landing data into governed Delta tables.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;H4&gt;How JSON fits into a&amp;nbsp;lakehouse&amp;nbsp;flow&amp;nbsp;&lt;/H4&gt;&lt;P&gt;A common&amp;nbsp;lakehouse&amp;nbsp;pattern begins with JSON arriving in the Files area of a&amp;nbsp;lakehouse, through a&amp;nbsp;OneLake&amp;nbsp;shortcut, or from an upstream ingestion process. The records might&amp;nbsp;represent&amp;nbsp;customer activity, application operations, device measurements, or partner transactions. A Fabric notebook reads those files,&amp;nbsp;applies&amp;nbsp;a schema, selects the fields needed by the business, and prepares the data for&amp;nbsp;additional&amp;nbsp;processing.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The same job can then filter invalid or irrelevant events, flatten nested structures, derive business attributes, and combine the JSON records with trusted reference data. Aggregations create useful metrics, while the curated result is stored in Delta tables for downstream notebooks, pipelines, the SQL analytics endpoint, and Power BI. The JSON read is the entry point to this larger analytical flow, so accelerating it helps the job begin productive columnar processing sooner.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Metadata-driven frameworks amplify this effect. A reusable pipeline may read many small JSON documents that describe source locations, schemas, validation rules, transformation steps, and destinations. Those reads happen across multiple tables and recurring schedules.&amp;nbsp;Keeping JSON parsing in the native path helps reduce repeated execution overhead and supports a more efficient foundation for standardized data engineering.&amp;nbsp;&lt;/P&gt;&lt;P&gt;This matters because customers evaluate performance at the job and pipeline level, not only at an individual operator. A faster source reader is most valuable when its output can continue through filters, projections, joins, and aggregations without unnecessary transitions between execution models.&amp;nbsp;&lt;/P&gt;&lt;H4&gt;Keeping JSON processing in the native path&amp;nbsp;&lt;/H4&gt;&lt;P&gt;The Native Execution Engine accelerates supported Spark operations by offloading them from the JVM-based execution path to a vectorized native engine built on Velox and Apache Gluten (incubating). Columnar processing allows the engine to&amp;nbsp;operate&amp;nbsp;on batches of values instead of repeatedly materializing individual row objects. This design improves data locality, enables efficient use of modern processors, and reduces overhead across many analytical operations.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Before native JSON support, a query that&amp;nbsp;encountered&amp;nbsp;a JSON source used the Spark JVM path for JSON reading and parsing. Even when filters, projections, aggregations, or joins later in the plan were eligible for native acceleration, the data first passed through row-oriented processing and then transitioned into a representation suitable for the accelerated path. Those handoffs reduced the amount of work that could&amp;nbsp;benefit&amp;nbsp;from continuous columnar execution.&amp;nbsp;&lt;/P&gt;&lt;P&gt;With this preview, JSON reading and parsing can run in the Velox-based native layer. Parsed values are produced as columnar batches that can flow directly into eligible native operators. By avoiding an early return to row-based JVM processing, Fabric Spark can reduce execution-path transitions and apply native acceleration across a larger&amp;nbsp;portion&amp;nbsp;of the job.&amp;nbsp;&lt;/P&gt;&lt;H4&gt;What this means for your workloads&amp;nbsp;&lt;/H4&gt;&lt;P&gt;The most important benefit is broader end-to-end acceleration. Customers can continue to use familiar Spark&amp;nbsp;DataFrame&amp;nbsp;and SQL patterns while the engine handles the execution-path improvements. There is no new JSON-specific programming model to&amp;nbsp;learn&amp;nbsp;and no need to rewrite existing transformations simply to access the native reader.&amp;nbsp;&lt;/P&gt;&lt;P&gt;For ingestion workloads, native JSON processing can help increase throughput before data is standardized into Delta tables. For metadata-driven pipelines, faster reads of configuration and control data can reduce overhead that appears repeatedly across orchestrated jobs. For analytical workloads that query JSON directly, filters and projections can begin from a native columnar source rather than waiting for a JVM-based parsing stage.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The result is a more consistent performance model across common&amp;nbsp;lakehouse&amp;nbsp;formats. Teams can design pipelines around business requirements and data characteristics while Fabric expands the set of operations that&amp;nbsp;remain&amp;nbsp;on the accelerated path.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Use the Spark APIs you already know&amp;nbsp;&lt;/P&gt;&lt;P&gt;Existing notebook code can continue to read JSON with standard Spark APIs. For example, a pipeline can load event data, select the fields needed for analysis, filter the records, and aggregate the results with the same&amp;nbsp;DataFrame&amp;nbsp;operations used today:&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="python"&gt;events = spark.read.json("Files/events/")  daily_activity = (      events.filter("eventType IS NOT NULL")            .groupBy("eventDate", "eventType")            .count()  ) &lt;/LI-CODE&gt;&lt;P&gt;When the plan uses supported operations, Fabric can execute the JSON&amp;nbsp;read&amp;nbsp;and downstream processing in the native columnar path. The optimization is delivered by the platform, so developers can focus on data quality, business logic, and the outputs their users need.&amp;nbsp;&lt;/P&gt;&lt;H4&gt;Build faster semi-structured data pipelines&amp;nbsp;&lt;/H4&gt;&lt;P&gt;JSON support is another step in expanding the performance coverage of the Native Execution Engine across real customer workloads. It brings acceleration closer to the point where semi-structured data enters the&amp;nbsp;lakehouse&amp;nbsp;and helps preserve columnar execution as that data is filtered, transformed, joined, and aggregated.&amp;nbsp;&lt;/P&gt;&lt;P&gt;To learn how the engine works and how to use it with Fabric Spark, see&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-engineering/native-execution-engine-overview" target="_blank" rel="noopener"&gt;Native execution engine for Fabric Data Engineering&lt;/A&gt;. You can also review&amp;nbsp;&lt;A href="https://learn.microsoft.com/fabric/data-engineering/runtime" target="_blank" rel="noopener"&gt;Apache Spark runtime in Fabric&lt;/A&gt;&amp;nbsp;and&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-engineering/lakehouse-and-delta-tables" target="_blank" rel="noopener"&gt;Lakehouse and Delta Tables&lt;/A&gt;&amp;nbsp;for more information about the broader Fabric data engineering platform.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Get started by running a representative JSON workload in a Fabric notebook and comparing the end-to-end job experience.&amp;nbsp;Review&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-engineering/how-to-use-notebook" target="_blank" rel="noopener"&gt;How to use notebooks&lt;/A&gt;&amp;nbsp;for guidance&amp;nbsp;and share your experience through the&amp;nbsp;&lt;A href="https://community.fabric.microsoft.com/" target="_blank" rel="noopener"&gt;Microsoft Fabric Community&lt;/A&gt;. Your feedback helps us prioritize the next areas of acceleration.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 17:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Accelerate-JSON-workloads-with-the-Native-Execution-Engine-in/ba-p/5364366</guid>
      <dc:creator>Santhosh_Ravin1</dc:creator>
      <dc:date>2026-09-10T17:00:00Z</dc:date>
    </item>
    <item>
      <title>Power BI Q&amp;A retirement reminder: February 2027 timeline update</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Updates-Blog/Power-BI-Q-A-retirement-reminder-February-2027-timeline-update/ba-p/5365841</link>
      <description>&lt;P&gt;In December, we &lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://community.fabric.microsoft.com/blog/fbc_pbiupdatesblog/deprecating-power-bi-qa/5173970" target="_blank" rel="noopener" data-lia-auto-title="announced the retirement of Power BI Q&amp;amp;A" data-lia-auto-title-active="0"&gt;announced the retirement of Power BI Q&amp;amp;A&lt;/A&gt;, our legacy natural-language querying experience, with retirement planned for December 2026. To give current Q&amp;amp;A user's additional time to assess their dependencies and transition to newer Copilot-powered solutions, we’re extending the retirement date to February 2027. This post recaps the affected experiences and provides updates on Copilot capacity availability, embedded scenarios, and sovereign clouds.&lt;/P&gt;
&lt;H2&gt;Recap of the January announcement&lt;/H2&gt;
&lt;H3&gt;What is being deprecated?&lt;/H3&gt;
&lt;P&gt;The retirement applies to both the end-user Q&amp;amp;A experiences, and the associated Q&amp;amp;A configuration tools.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="2" style="width: 100%; height: 268px; border-width: 2px;"&gt;&lt;tbody&gt;&lt;tr style="height: 36px;"&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Retiring experience&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Recommended alternative&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 36px;"&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/consumer/end-user-q-and-a" target="_blank"&gt;Q&amp;amp;A in reports&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-reports-overview" target="_blank"&gt;Copilot with Power BI reports&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 36px;"&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/consumer/end-user-q-and-a" target="_blank"&gt;Q&amp;amp;A on a dashboard&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-chat-with-data-standalone" target="_blank"&gt;Copilot standalone experience&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 60px;"&gt;&lt;td style="height: 60px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/consumer/mobile/tutorial-mobile-apps-ios-qna" target="_blank"&gt;Q&amp;amp;A virtual analyst in mobile app&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 60px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/consumer/mobile/mobile-apps-copilot" target="_blank"&gt;Copilot in Power BI Mobile&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 60px;"&gt;&lt;td style="height: 60px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/developer/embedded/qanda" target="_blank"&gt;Q&amp;amp;A in Power BI embedded analytics&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 60px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://powerbi.microsoft.com/blog/now-available-two-new-copilot-experiences/" target="_blank"&gt;Copilot for SaaS scenarios&lt;/A&gt;. For embedded PaaS scenarios, refer to the updates later in this post.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 40px;"&gt;&lt;td style="height: 40px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/natural-language/q-and-a-tooling-intro" target="_blank"&gt;Q&amp;amp;A Setup&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 40px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-prepare-data-ai" target="_blank"&gt;Prep Data for AI&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;What happens at retirement?&lt;/H3&gt;
&lt;P&gt;Beginning in February 2027, Q&amp;amp;A will no longer work in Power BI. The Q&amp;amp;A visual will be removed, and existing reports that contain Q&amp;amp;A visuals will display an error in place of the visual.&lt;/P&gt;
&lt;H2&gt;Updates since December&lt;/H2&gt;
&lt;H3&gt;Copilot availability across capacities&lt;/H3&gt;
&lt;P&gt;One of the most common questions following the December announcement was how customers relying primarily on Power BI Pro licenses could adopt Copilot capabilities after the retirement of Q&amp;amp;A.&lt;/P&gt;
&lt;P&gt;Copilot is now available across all Fabric capacities starting at &lt;STRONG&gt;F2&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;In addition, &lt;A class="lia-external-url" href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Updates-to-Fabric-Copilot-Capacity/ba-p/5172772" target="_blank"&gt;Fabric Copilot Capacity (FCC)&lt;/A&gt;, which was initially limited to &lt;STRONG&gt;P1/F64 and above&lt;/STRONG&gt;, can now be created on &lt;STRONG&gt;F2 and higher capacities&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;FCC is an optional way to centralize Copilot usage for assigned users, including Pro and PPU workspaces, on one capacity. &lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-introduction" target="_blank"&gt;Review the current Copilot requirements.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This change makes Copilot available on smaller Fabric capacities, giving organizations that previously relied on Power BI Pro licenses another path to evaluate Copilot without moving immediately to a larger Premium or Fabric capacity.&lt;/P&gt;
&lt;H3&gt;Embedded (PaaS) Q&amp;amp;A scenarios&lt;/H3&gt;
&lt;P&gt;Another common question following the December announcement was whether Copilot would provide a direct replacement for Q&amp;amp;A in embedded (PaaS) scenarios.&lt;/P&gt;
&lt;P&gt;There are currently no plans to provide a Copilot replacement for embedded Q&amp;amp;A PaaS scenarios.&lt;/P&gt;
&lt;P&gt;Organizations using embedded Q&amp;amp;A should begin evaluating migration paths and alternative analytical experiences well before the February 2027 retirement date. Although these options are not direct replacements for embedded Q&amp;amp;A, customers can consider:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://powerbi.microsoft.com/blog/now-available-two-new-copilot-experiences/" target="_blank"&gt;Copilot for SaaS scenarios&lt;/A&gt;, for organizations that can transition from an embedded PaaS architecture to a supported SaaS experience.&lt;/LI&gt;
&lt;LI&gt;Narrative visual and smart narrative summaries&lt;/LI&gt;
&lt;LI&gt;Fabric IQ MCP Server&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Customers with embedded analytics solutions should review their current Q&amp;amp;A integrations and plan migration paths before retirement.&lt;/P&gt;
&lt;H3&gt;Copilot in sovereign clouds&lt;/H3&gt;
&lt;P&gt;Customers operating in sovereign cloud environments have also asked about Copilot availability following the retirement of Q&amp;amp;A.&lt;/P&gt;
&lt;P&gt;Copilot does not yet support sovereign clouds due to GPU availability. Organizations using Q&amp;amp;A in sovereign clouds should review their dependencies and contact their Microsoft account representative or support team to discuss migration options.&lt;/P&gt;
&lt;H2&gt;Recommended next steps&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;To prepare for the retirement of Q&amp;amp;A:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Inventory existing Q&amp;amp;A dependencies, including reports, dashboards, mobile experiences, embedded solutions, and Q&amp;amp;A Setup artifacts.&lt;/LI&gt;
&lt;LI&gt;Identify the appropriate migration path for each dependency, using Copilot-powered experiences where they are available and meet your requirements.&lt;/LI&gt;
&lt;LI&gt;Review embedded Q&amp;amp;A implementations and evaluate supported SaaS patterns or other analytical experiences.&lt;/LI&gt;
&lt;LI&gt;Confirm Copilot availability in your region, particularly for sovereign cloud deployments, before selecting an alternative.&lt;/LI&gt;
&lt;LI&gt;Plan, test, and communicate changes before Q&amp;amp;A reaches full retirement in February 2027.&lt;/LI&gt;
&lt;LI&gt;Starting these activities early will help ensure a smooth transition before Q&amp;amp;A reaches full retirement in February 2027.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The extension to February 2027 provides additional time to assess existing Q&amp;amp;A dependencies and evaluate replacement experiences. We encourage customers to begin planning their transition now, &lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-introduction" target="_blank"&gt;review Copilot availability and requirements&lt;/A&gt;, and test alternative experiences well before retirement. Taking these steps early can help ensure a smooth transition when Q&amp;amp;A reaches end of support in February 2027.&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 16:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Updates-Blog/Power-BI-Q-A-retirement-reminder-February-2027-timeline-update/ba-p/5365841</guid>
      <dc:creator>mohammadali</dc:creator>
      <dc:date>2026-09-10T16:00:00Z</dc:date>
    </item>
    <item>
      <title>Reassigning a Workspace in the Microsoft Fabric Admin Portal</title>
      <link>https://community.fabric.microsoft.com/t5/Data-Engineering-Community-Blog/Reassigning-a-Workspace-in-the-Microsoft-Fabric-Admin-Portal/ba-p/5365868</link>
      <description>&lt;H1&gt;Reassigning a Workspace in the Microsoft Fabric Admin Portal&lt;/H1&gt;&lt;P&gt;When working with Microsoft Fabric, workspaces are an important part of organising and managing analytics content. A workspace can contain items such as Lakehouses, Warehouses, Notebooks, Data Pipelines, semantic models, and Power BI reports.&lt;/P&gt;&lt;P&gt;Depending on how a workspace is configured, it can be assigned to different types of capacity. There may be situations where a workspace that was originally running on a Power BI Pro shared environment needs to be moved to a Microsoft Fabric Capacity.&lt;/P&gt;&lt;P&gt;In this article, I'll show how to reassign a workspace to a Fabric Capacity using the &lt;STRONG&gt;Microsoft Fabric Admin Portal&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;For this demonstration, I have a workspace named &lt;STRONG&gt;task wk&lt;/STRONG&gt;, which is currently assigned to the &lt;STRONG&gt;Power BI Pro&lt;/STRONG&gt; workspace type.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Current Workspace Configuration&lt;/H2&gt;&lt;P&gt;I have already created the following workspace:&lt;/P&gt;&lt;P&gt;Workspace Name: &lt;STRONG&gt;task wk &lt;/STRONG&gt;Workspace Type: Power BI Pro&lt;/P&gt;&lt;P&gt;At the moment, &lt;STRONG&gt;task wk &lt;/STRONG&gt;is not assigned to my Fabric Capacity.&lt;/P&gt;&lt;P&gt;The objective is to move this same workspace from its current Power BI Pro setup and assign it to a Fabric Capacity.&lt;/P&gt;&lt;P&gt;Rather than creating a new workspace, I can simply reassign the existing workspace.&lt;/P&gt;&lt;H2&gt;Open the Fabric Admin Portal&lt;/H2&gt;&lt;P&gt;The first step is to open the &lt;STRONG&gt;Microsoft Fabric Admin Portal&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;From the Fabric interface, open the settings menu and select &lt;STRONG&gt;Admin portal&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;The Admin Portal provides administrators with tenant-level management capabilities, including the ability to manage workspaces and their capacity assignments.&lt;/P&gt;&lt;P&gt;For this task, I need to work with the &lt;STRONG&gt;Workspaces&lt;/STRONG&gt; section.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Go to the Workspaces Tab&lt;/H2&gt;&lt;P&gt;Inside the Fabric Admin Portal, select &lt;STRONG&gt;Workspaces&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;This section provides a view of the workspaces available within the Fabric tenant.&lt;/P&gt;&lt;P&gt;I can search for my workspace by name rather than scrolling through the entire list.&lt;/P&gt;&lt;P&gt;In my case, I'm looking for:&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;task wk&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Once I locate the workspace, I can see its current configuration.&lt;/P&gt;&lt;P&gt;The workspace is currently associated with the &lt;STRONG&gt;Power BI Pro&lt;/STRONG&gt; workspace type.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Select Reassign Workspace&lt;/H2&gt;&lt;P&gt;To change the capacity assignment, I select the &lt;STRONG&gt;ellipsis (...)&lt;/STRONG&gt; next to &lt;STRONG&gt;task wk&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;This opens a menu containing actions that can be performed on the workspace.&lt;/P&gt;&lt;P&gt;From the menu, I select:&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Reassign workspace&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;This is the option I need to change the workspace's capacity assignment.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Select the Fabric Capacity&lt;/H2&gt;&lt;P&gt;After selecting &lt;STRONG&gt;Reassign workspace&lt;/STRONG&gt;, Fabric presents the available capacity options.&lt;/P&gt;&lt;P&gt;From here, I select the &lt;STRONG&gt;Fabric Capacity&lt;/STRONG&gt; that I want to assign to the workspace.&lt;/P&gt;&lt;P&gt;The important thing is to make sure I select the correct capacity, particularly if the organisation has multiple Fabric capacities.&lt;/P&gt;&lt;P&gt;Once the appropriate Fabric Capacity has been selected, I confirm the reassignment.&lt;/P&gt;&lt;P&gt;Fabric then updates the workspace's capacity assignment.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Verifying the Workspace&lt;/H2&gt;&lt;P&gt;After completing the reassignment, I can return to the &lt;STRONG&gt;Workspaces&lt;/STRONG&gt; section in the Admin Portal and check &lt;STRONG&gt;task wk&lt;/STRONG&gt; again.&lt;/P&gt;&lt;img /&gt;&lt;P&gt;The workspace should now show that it is assigned to the selected &lt;STRONG&gt;Fabric Capacity&lt;/STRONG&gt; rather than its previous Power BI Pro setup.&lt;/P&gt;&lt;img /&gt;&lt;P&gt;The workspace itself has not been recreated. The existing workspace and its contents remain in place; what has changed is the capacity to which the workspace is assigned.&lt;/P&gt;&lt;P&gt;This is useful because I don't need to migrate all the workspace items into a new workspace simply because I want to change the capacity.&lt;/P&gt;&lt;H2&gt;Why Reassign a Workspace?&lt;/H2&gt;&lt;P&gt;There are several reasons why an organisation might want to reassign a workspace to Fabric Capacity.&lt;/P&gt;&lt;P&gt;One common reason is to make Fabric capabilities available to the workspace.&lt;/P&gt;&lt;P&gt;For example, an organisation may start with a traditional Power BI workspace and later adopt Microsoft Fabric. Moving the workspace to an appropriate Fabric Capacity can be part of that transition.&lt;/P&gt;&lt;P&gt;Capacity assignment can also be useful when an organisation wants to manage workloads using dedicated capacity rather than relying on shared capacity.&lt;/P&gt;&lt;H2&gt;A Simple Before and After&lt;/H2&gt;&lt;P&gt;In this example, the change can be summarised as:&lt;/P&gt;&lt;P&gt;Before &lt;STRONG&gt;task wk --&amp;gt;&lt;/STRONG&gt;&amp;nbsp;Power BI Pro&lt;/P&gt;&lt;P&gt;After the reassignment:&lt;/P&gt;&lt;P&gt;After &lt;STRONG&gt;task wk --&amp;gt;&lt;/STRONG&gt;&amp;nbsp;Fabric Capacity&lt;/P&gt;&lt;P&gt;The workspace name remains the same, and I don't have to create another workspace just to make the change.&lt;/P&gt;&lt;H2&gt;Things to Consider&lt;/H2&gt;&lt;P&gt;Before reassigning a workspace, it is worth checking that you have the appropriate administrative permissions and that the target Fabric Capacity is available.&lt;/P&gt;&lt;P&gt;It is also important to understand the implications of moving a workspace between capacity types, especially in an organisation where capacity usage, governance, and licensing are carefully managed.&lt;/P&gt;&lt;P&gt;The exact options available in the Admin Portal can also depend on the tenant configuration and the permissions of the administrator.&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 13:38:41 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Data-Engineering-Community-Blog/Reassigning-a-Workspace-in-the-Microsoft-Fabric-Admin-Portal/ba-p/5365868</guid>
      <dc:creator>abiola_david</dc:creator>
      <dc:date>2026-09-10T13:38:41Z</dc:date>
    </item>
    <item>
      <title>One button, fifty rows: bulk write-back from Power BI to Fabric SQL using a UDF | Part-1</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/One-button-fifty-rows-bulk-write-back-from-Power-BI-to-Fabric/ba-p/5364353</link>
      <description>&lt;P&gt;Most writeback examples you'll find handle one record at a time. This one takes whatever the user has selected in the slicer — one hotel or fifty — passes the whole selection to a User Data Function as a single call, and writes it all in one transaction.&lt;/P&gt;
&lt;P&gt;Every reporting team eventually gets the same request. Someone looks at a table in a Power BI report, spots a value that is wrong, and asks why they have to email the data team to fix it. In our case it was hotel code setup: mapping each hotel's code types to a Major Group and a Minor Group. The mappings changed often enough to be annoying and rarely enough that nobody wanted to build a whole application for it.&lt;/P&gt;
&lt;P&gt;Translytical task flows finally made this practical. This post walks through the setup I actually built and shipped.&lt;/P&gt;
&lt;P&gt;The stack is Fabric SQL database → User Data Function → a button in a Power BI report.&lt;/P&gt;
&lt;img /&gt;&lt;img /&gt;
&lt;H2&gt;What it needed to do&lt;/H2&gt;
&lt;P&gt;Three requirements shaped everything else.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Edit one hotel or fifty in a single click.&lt;/STRONG&gt; Code type mappings are usually rolled out across a brand or a region, not one property at a time. If the user has to click through hotels one by one, they will go back to emailing spreadsheets.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Record who changed what, at column level.&lt;/STRONG&gt; "Someone changed the Major Group last month" is not an audit trail. I wanted old value, new value, the person's actual name, and a timestamp, for each column that moved.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Fail loudly and readably.&lt;/STRONG&gt; The people using this are finance and operations users, not developers. An error has to tell them what to do next, not surface a SQL exception.&lt;/P&gt;
&lt;H2&gt;1. The SQL database&lt;/H2&gt;
&lt;P&gt;Everything starts with the schema. The full script is at the bottom of this post, but three decisions in it are worth explaining because they are the ones that determine whether bulk editing works at all.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;The primary key&lt;/H3&gt;
&lt;P&gt;The original table used CodeType as the primary key. That works fine for one hotel and falls apart immediately for many, because five hotels sharing the code type FBFOOD need five separate rows.&lt;/P&gt;
&lt;P&gt;So the table gets a surrogate identity column as the PK, and the real business rule moves into a unique constraint:&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CONSTRAINT PK_HotelCodeSetup PRIMARY KEY CLUSTERED (HotelCodeSetupId), CONSTRAINT UQ_HotelCodeSetup_Hotel_Code UNIQUE (HotelCode, CodeType)&lt;/LI-CODE&gt;
&lt;P&gt;The unique constraint is what actually stops duplicates. The surrogate ID exists so the audit table has something stable to point at.&lt;/P&gt;
&lt;H3&gt;The audit table stores one row per changed column&lt;/H3&gt;
&lt;P&gt;Not one row per changed record. If a user updates Major Group and leaves Minor Group alone, I want exactly one audit row, saying which column moved and from what to what.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CREATE TABLE audit.HotelCodeSetupAudit ( AuditId BIGINT IDENTITY(1,1) NOT NULL, BatchId UNIQUEIDENTIFIER NOT NULL, InvocationId VARCHAR(100) NULL, HotelCodeSetupId INT NULL, HotelCode VARCHAR(10) NOT NULL, CodeType VARCHAR(20) NOT NULL, ActionType VARCHAR(10) NOT NULL, ColumnName VARCHAR(50) NOT NULL, OldValue NVARCHAR(200) NULL, NewValue NVARCHAR(200) NULL, ChangedBy NVARCHAR(200) NOT NULL, ChangedByOid VARCHAR(50) NULL, ChangedDateUtc DATETIME2(3) NOT NULL, SourceApplication VARCHAR(50) NULL );&lt;/LI-CODE&gt;
&lt;P&gt;BatchId is the piece that makes this usable. One button click produces one BatchId, however many hotels it touched. That gives you a natural unit for "show me everything that click did", and later, for rollback.&lt;/P&gt;
&lt;H3&gt;Why the audit is not a trigger&lt;/H3&gt;
&lt;P&gt;This is the one I would have got wrong if I hadn't tested it as a second user.&lt;/P&gt;
&lt;P&gt;A trigger runs under the identity of the database connection. In this architecture that connection belongs to the User Data Function, so every single change would be attributed to the same account. The audit would be technically complete and practically worthless.&lt;/P&gt;
&lt;P&gt;The user identity has to come from the function's call context and be passed in as a parameter, which means the audit writes have to happen inside the stored procedure, in the same transaction as the change itself.&lt;/P&gt;
&lt;H3&gt;The upsert&lt;/H3&gt;
&lt;P&gt;MERGE handles single and multi-hotel through one code path. The hotel list arrives as a comma-delimited string and gets split into a table variable, so one hotel is just a list of length one and there is no separate branch to maintain.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;MERGE dbo.HotelCodeSetup WITH (HOLDLOCK) AS tgt USING (SELECT HotelCode FROM @Hotels) AS src ON tgt.HotelCode = src.HotelCode AND tgt.CodeType = @CodeType WHEN MATCHED AND ( ISNULL(tgt.MajorGroup, '') &amp;lt;&amp;gt; ISNULL(COALESCE(@MajorGroup, tgt.MajorGroup), '') OR ISNULL(tgt.MinorGroup, '') &amp;lt;&amp;gt; ISNULL(COALESCE(@MinorGroup, tgt.MinorGroup), '') OR tgt.IsActive = 0 ) THEN UPDATE SET&lt;/LI-CODE&gt;
&lt;P&gt;Two details in there that matter more than they look:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-13"&gt;COALESCE(@MajorGroup, tgt.MajorGroup)&lt;/SPAN&gt; is how "leave this column alone" works. A blank text slicer becomes &lt;SPAN class="lia-text-color-13"&gt;NULL&lt;/SPAN&gt;, and &lt;SPAN class="lia-text-color-13"&gt;NULL&lt;/SPAN&gt; means keep the existing value rather than wipe it. Without this, a user who only wants to change Minor Group would silently blank out Major Group.&lt;/P&gt;
&lt;P&gt;The &lt;SPAN class="lia-text-color-13"&gt;WHEN MATCHED AND (...)&lt;/SPAN&gt; guard means rows that already hold the target values are not touched at all. No pointless &lt;SPAN class="lia-text-color-13"&gt;ModifiedDateUtc&lt;/SPAN&gt; churn, and no audit noise.&lt;/P&gt;
&lt;P&gt;The &lt;SPAN class="lia-text-color-13"&gt;OUTPUT&lt;/SPAN&gt; clause writes &lt;SPAN class="lia-text-color-13"&gt;$action&lt;/SPAN&gt; plus old and new values into a table variable, which then gets unpivoted with &lt;SPAN class="lia-text-color-13"&gt;CROSS APPLY&lt;/SPAN&gt; into the column-level audit rows. That unpivot is where the "skip columns that didn't change" filter lives.&lt;/P&gt;
&lt;P&gt;Deletes are soft. &lt;SPAN class="lia-text-color-13"&gt;usp_DeactivateHotelCodes&lt;/SPAN&gt; sets &lt;SPAN class="lia-text-color-13"&gt;IsActive = 0&lt;/SPAN&gt; and audits it, so the audit trail always resolves to a row that still exists.&lt;/P&gt;
&lt;H3&gt;Run the smoke tests before Power BI is anywhere near this&lt;/H3&gt;
&lt;P&gt;The bottom of the script has direct EXEC calls for both single and multi-hotel. Run them. If the procedure works in the query editor, then every problem you hit later is a Power BI or UDF problem, and you have halved your search space.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;EXEC dbo.usp_UpsertHotelCodeGroups @HotelCodes = 'HTL001,HTL002,HTL003', @CodeType = 'RMREV', @MajorGroup = 'Rooms Division', @MinorGroup = NULL, @ChangedBy = 'test.user@contoso.com';&lt;/LI-CODE&gt;&lt;img /&gt;
&lt;H2&gt;2. The User Data Function&lt;/H2&gt;
&lt;P&gt;Create a &lt;STRONG&gt;User Data Functions&lt;/STRONG&gt; item in the same workspace. Under &lt;STRONG&gt;Manage connections&lt;/STRONG&gt;, add the SQL database, and note the alias Fabric generates. That alias goes into the decorator.&lt;/P&gt;
&lt;img /&gt;&lt;LI-CODE lang="python"&gt;import fabric.functions as fn udf = fn.UserDataFunctions() @udf.connection(argName="writebackDb", alias="Writeback") @udf.context(argName="callContext") @udf.function() def apply_hotel_code_groups( writebackDb: fn.FabricSqlConnection, callContext: fn.UserDataFunctionContext, hotelCodes: str, codeType: str, majorGroup: str = "", minorGroup: str = "", ) -&amp;gt; str:&lt;/LI-CODE&gt;
&lt;P&gt;Three platform rules that are not optional:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Parameter names must be camelCase. No underscores. hotel_codes will not work.&lt;/LI&gt;
&lt;LI&gt;The function must return str if you want it to show up in the Power BI button picker. A function returning a dict simply won't appear in the list, with no explanation.&lt;/LI&gt;
&lt;LI&gt;import fabric.functions as fn and the udf = fn.UserDataFunctions() line are both required.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If the editor complains about the stacked @udf.connection and @udf.context decorators, swap their order. Both sit above @udf.function().&lt;/P&gt;
&lt;H3&gt;Getting the real user&lt;/H3&gt;
&lt;LI-CODE lang="python"&gt;def _identity(callContext) -&amp;gt; tuple: try: user = callContext.executing_user or {} return (user.get("PreferredUsername") or "unknown", user.get("Oid")) except Exception: return ("unknown", None)&lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-13"&gt;PreferredUsername&lt;/SPAN&gt; is the readable one for the report. Oid is the Entra object ID, which is immutable and survives people changing their name or email. Store both.&lt;/P&gt;
&lt;H3&gt;Validation lives in Python&lt;/H3&gt;
&lt;P&gt;The stored procedure validates too, as a backstop, but the messages users actually see come from UserThrownError:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;if not codes: raise fn.UserThrownError( "No hotel selected. Use the hotel slicer to pick one or more hotels first.", {"hotelCodes": hotelCodes}, ) if len(codes) &amp;gt; MAX_HOTELS_PER_CALL: raise fn.UserThrownError( f"{len(codes)} hotels selected, which is over the {MAX_HOTELS_PER_CALL} limit. " "Narrow the selection and apply in smaller batches.", {"selectedCount": len(codes)}, )&lt;/LI-CODE&gt;
&lt;P&gt;MAX_HOTELS_PER_CALL is set to 250. This is a guard rail, not a performance tuning knob. Power BI hands the function whatever the slicer selection contains, and large payloads run into UDF request size and execution timeout limits. A bulk edit that times out halfway is exactly what the transaction in the procedure is there to protect you from, but it is better not to get there.&lt;/P&gt;
&lt;H3&gt;The return string is your UI&lt;/H3&gt;
&lt;P&gt;Since the function has to return a string anyway, make it a useful one. The procedure returns a result set with counts, and the function turns that into something a user can read in the toast notification:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;return (f"'{code_type}' across {requested} hotel(s): " f"{detail}. {audit_rows} audit row(s) written. Batch {str(batch_id)[:8]}.")&lt;/LI-CODE&gt;
&lt;P&gt;So the user sees something like &lt;EM&gt;"'RMREV' across 12 hotel(s): 9 updated, 3 already matched. 9 audit row(s) written. Batch a3f2c101."&lt;/EM&gt; That last part is genuinely useful when someone reports a problem, because you can look up the exact batch.&lt;/P&gt;
&lt;P&gt;One thing that will bite you when reading the procedure's output: SET NOCOUNT ON helps, but you can still land on a resultless set before the SELECT. Skip forward until there is something to read:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;def _first_result_row(cursor): while cursor.description is None: if not cursor.nextset(): return None return cursor.fetchone()&lt;/LI-CODE&gt;
&lt;P&gt;Publish, then test in the portal's Run pane before touching Power BI.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;3. The semantic model&lt;/H2&gt;
&lt;P&gt;Connect Power BI Desktop to the SQL database in &lt;STRONG&gt;DirectQuery&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Point at the &lt;STRONG&gt;SQL database endpoint, not the SQL analytics endpoint.&lt;/STRONG&gt; This one cost me an hour. The analytics endpoint mirrors into OneLake on a delay, so when the button refreshes the report the write has not landed yet. The user clicks Apply, the table doesn't change, and they conclude the button is broken. It isn't. You're just reading a copy.&lt;/P&gt;
&lt;P&gt;Bring in dbo.HotelCodeSetup and audit.vw_HotelCodeSetupHistory.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;4. DAX&lt;/H2&gt;
&lt;P&gt;This measure is what makes multi-hotel editing work. It collapses the slicer selection into the comma-delimited list the function expects:&lt;/P&gt;
&lt;LI-CODE lang="dax"&gt;Selected Hotel Codes = IF ( ISFILTERED ( HotelCodeSetup[HotelCode] ), CONCATENATEX ( VALUES ( HotelCodeSetup[HotelCode] ), HotelCodeSetup[HotelCode], "," ), BLANK () )&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Do not skip the ISFILTERED guard.&lt;/STRONG&gt; Without it, an empty slicer returns every hotel in the model. One stray click and you have rewritten the entire estate, correctly, transactionally, and with a beautiful audit trail of the disaster. Returning BLANK() instead makes the function reject the call with a readable message.&lt;/P&gt;
&lt;LI-CODE lang="dax"&gt;Selected Hotel Count = IF ( ISFILTERED ( HotelCodeSetup[HotelCode] ), COUNTROWS ( VALUES ( HotelCodeSetup[HotelCode] ) ), 0 ) Selected Code Type = SELECTEDVALUE ( HotelCodeSetup[CodeType] )&lt;/LI-CODE&gt;
&lt;P&gt;SELECTEDVALUE returns blank when zero or several code types are selected, so ambiguous input gets rejected rather than quietly applied to the wrong one.&lt;/P&gt;
&lt;P&gt;And a live button label, because bulk edits deserve a preview of the blast radius:&lt;/P&gt;
&lt;LI-CODE lang="dax"&gt;Apply Button Label = VAR _n = [Selected Hotel Count] VAR _type = [Selected Code Type] RETURN SWITCH ( TRUE (), _n = 0, "Select at least one hotel", ISBLANK ( _type ), "Select one code type", _n = 1, "Apply to 1 hotel", "Apply to " &amp;amp; _n &amp;amp; " hotels" )&lt;/LI-CODE&gt;&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-13"&gt;&lt;EM&gt;&lt;STRONG&gt;Please check Part 2, as the post is a little lengthy.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/H3&gt;</description>
      <pubDate>Wed, 09 Sep 2026 18:45:16 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/One-button-fifty-rows-bulk-write-back-from-Power-BI-to-Fabric/ba-p/5364353</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-09T18:45:16Z</dc:date>
    </item>
    <item>
      <title>Get ready for table discovery in OneLake Catalog search (Preview)</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Get-ready-for-table-discovery-in-OneLake-Catalog-search-Preview/ba-p/5365764</link>
      <description>&lt;P&gt;In late September, OneLake Catalog will begin surfacing tables as searchable objects in Microsoft Fabric. This change expands which table metadata users can discover based on their existing item permissions, so administrators may want to review the related tenant setting before rollout.&lt;/P&gt;&lt;P&gt;To give organizations time to prepare, the controlling tenant setting is already available in the Fabric admin portal. Administrators can review and configure this setting before table search becomes available.&lt;/P&gt;&lt;P&gt;Tables are the first object, an entity contained inside a Microsoft Fabric item, that OneLake Catalog will return as a standalone search result. Bringing objects into search makes the catalog more useful for everyday discovery because they are often where analysis, reporting, and development work begins.&lt;/P&gt;&lt;H2&gt;Find tables directly&lt;/H2&gt;&lt;P&gt;Finding the right data often starts below the item level. You may know a table name, its purpose, or only the name of a column it contains, but not which item contains it. Table discovery will let you search directly for tables in semantic models, lakehouses, and mirrored databases without first locating and opening the parent item. We plan to support tables from more Microsoft Fabric item types, along with additional object types, as OneLake Catalog expands beyond item-level discovery.&lt;/P&gt;&lt;P&gt;Each matching table will appear as its own result rather than as metadata attached to the parent item. Columns will not appear as standalone results, but you can still find the relevant table when a column name is your only starting point.&lt;/P&gt;&lt;P&gt;Table discovery will be available in Fabric’s global search UI and programmatically through the &lt;A href="https://learn.microsoft.com/rest/api/fabric/core/catalog/search" target="_blank"&gt;OneLake Catalog Search API&lt;/A&gt;. You will be able to search by table name or description or use an exact column-name match to find its containing table, without knowing the workspace or parent item in advance.&lt;/P&gt;&lt;P&gt;You can also access search through the &lt;A href="https://learn.microsoft.com/rest/api/fabric/articles/mcp-servers/core-remote/overview-core-mcp-server" target="_blank"&gt;Fabric Core remote MCP server&lt;/A&gt;, &lt;A href="https://learn.microsoft.com/rest/api/fabric/articles/mcp-servers/pro-dev-local/overview-local-mcp-server" target="_blank"&gt;Fabric local MCP server&lt;/A&gt;, or the search skill from the &lt;A href="https://github.com/microsoft/skills-for-fabric" target="_blank"&gt;Fabric Skills library&lt;/A&gt;. These options bring the same permission-aware discovery to applications, AI agents, GitHub Copilot, and other compatible AI coding tools.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img&gt;&lt;EM&gt;Figure: A semantic model table returned as a standalone search result.&lt;/EM&gt;&lt;/img&gt;&lt;H2&gt;Understand how permissions affect table visibility&lt;/H2&gt;&lt;P&gt;Before table search becomes available, administrators should understand how existing permissions affect what users can discover. This change does not grant access to additional data, but it may allow users to discover metadata for tables contained within items they can already access.&lt;/P&gt;&lt;P&gt;You can discover a table only if you have Read control-plane permission or higher on its parent item. You do not need Read All or Read Data permission to find a table in search.&lt;/P&gt;&lt;P&gt;Data-plane permissions, including &lt;A href="https://learn.microsoft.com/fabric/onelake/security/get-started-onelake-security" target="_blank"&gt;OneLake security&lt;/A&gt;, do not change whether a table appears in catalog search. The relevant workload still enforces its data-access permissions when you open, query, or otherwise use the table. Catalog discoverability and data access remain separate decisions.&lt;/P&gt;&lt;P&gt;Tables in semantic models protected by &lt;A href="https://learn.microsoft.com/fabric/security/service-admin-object-level-security" target="_blank"&gt;object-level security&lt;/A&gt; are excluded from search. Object-level security can protect table and column names as well as their metadata, so OneLake Catalog currently does not surface tables from those models.&lt;/P&gt;&lt;H2&gt;Control object discovery with a tenant setting&lt;/H2&gt;&lt;P&gt;Before table search rolls out, Fabric administrators should review the &lt;STRONG&gt;Users can find objects in search&lt;/STRONG&gt; tenant setting. This setting controls whether users can discover contained objects such as tables through Global Search and the Search API.&lt;/P&gt;&lt;P&gt;The setting is enabled by default, allowing users to find supported objects when they have access to the parent item. When it is disabled, search results are limited to top-level Fabric items, such as lakehouses and reports. Disabling the setting does not change access to the underlying items or data; it changes whether contained objects appear in search.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img&gt;&lt;EM&gt;Figure: The tenant setting for controlling object visibility in search results.&lt;/EM&gt;&lt;/img&gt;&lt;H2&gt;Additional search improvements&lt;/H2&gt;&lt;P&gt;Apart from table discovery, this release also introduces several improvements in search for Microsoft Fabric items.&lt;/P&gt;&lt;H3&gt;Get richer item results&lt;/H3&gt;&lt;P&gt;New filters and expanded metadata make item results more precise and useful. You can:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Return and filter item results by &lt;STRONG&gt;endorsement&lt;/STRONG&gt; status, &lt;STRONG&gt;workspace&lt;/STRONG&gt; ID, and &lt;STRONG&gt;sensitivity label&lt;/STRONG&gt; ID.&lt;/LI&gt;&lt;LI&gt;Find &lt;STRONG&gt;dataflows&lt;/STRONG&gt; and &lt;STRONG&gt;dashboards&lt;/STRONG&gt; in search results.&lt;/LI&gt;&lt;LI&gt;Identify reports and dashboards included in a &lt;STRONG&gt;workspace app&lt;/STRONG&gt; and retrieve the relevant app context.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;This context helps you distinguish between similar items, apply governance signals, and choose the right result without making additional requests.&lt;/P&gt;&lt;P&gt;These improvements provide more ways to narrow large result sets and enough context to understand where an item belongs before you open it.&lt;/P&gt;&lt;H3&gt;Refine searches with new operators&lt;/H3&gt;&lt;P&gt;New query operators give you more control over how search interprets your terms:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Use quotation marks (" ") to search for an exact phrase.&lt;/LI&gt;&lt;LI&gt;Use an asterisk (*) as a wildcard for multiple characters.&lt;/LI&gt;&lt;LI&gt;Use a question mark (?) as a wildcard for a single character.&lt;/LI&gt;&lt;LI&gt;Use double ampersands (&amp;amp;&amp;amp;) to return only results that contain all specified terms.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;These operators help you narrow results when names are similar or when you know only part of a name.&lt;/P&gt;&lt;H2&gt;Prepare for rollout&lt;/H2&gt;&lt;P&gt;Tables are the starting point for discovery below the Fabric item level. The same catalog model can support more object types over time while preserving parent context, permission trimming, and a consistent way to search. For now, table search addresses a common need: finding the table you want from its name, description, or an exact column-name match without already knowing where it lives.&lt;/P&gt;&lt;P&gt;Table search will begin rolling out late September. Before rollout, administrators should review the tenant setting, and developers can prepare the search experiences they plan to offer:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Review the &lt;STRONG&gt;Users can find objects in search&lt;/STRONG&gt; tenant setting in the Fabric admin portal and decide whether object discovery should be enabled for your organization.&lt;/LI&gt;&lt;LI&gt;Explore the &lt;A href="https://learn.microsoft.com/rest/api/fabric/core/catalog/search" target="_blank"&gt;OneLake Catalog Search API&lt;/A&gt; if you build data portals, governance tools, or other discovery experiences.&lt;/LI&gt;&lt;LI&gt;Connect an AI development tool through a &lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/articles/mcp-servers/core-remote/overview-core-mcp-server" target="_blank"&gt;Fabric MCP server &lt;/A&gt;or install the search skill from the &lt;A class="lia-external-url" href="https://github.com/microsoft/skills-for-fabric" target="_blank"&gt;Fabric Skills library &lt;/A&gt;to prepare agentic discovery workflows.&lt;/LI&gt;&lt;/UL&gt;</description>
      <pubDate>Wed, 09 Sep 2026 14:09:05 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Get-ready-for-table-discovery-in-OneLake-Catalog-search-Preview/ba-p/5365764</guid>
      <dc:creator>nschachter</dc:creator>
      <dc:date>2026-09-09T14:09:05Z</dc:date>
    </item>
    <item>
      <title>One button, fifty rows: bulk write-back from Power BI to Fabric SQL using a UDF | Part-2</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/One-button-fifty-rows-bulk-write-back-from-Power-BI-to-Fabric/ba-p/5364356</link>
      <description>&lt;H2&gt;5. The report page&lt;/H2&gt;
&lt;P&gt;Enable &lt;STRONG&gt;Translytical task flows&lt;/STRONG&gt; and &lt;STRONG&gt;Text slicer&lt;/STRONG&gt; under Preview features in Desktop first, or the Data function action type will not appear on the button at all.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Element&lt;/th&gt;&lt;th&gt;Setup&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Hotel slicer&lt;/td&gt;&lt;td&gt;HotelCode, multi-select on. This is what drives single vs bulk.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Code type slicer&lt;/td&gt;&lt;td&gt;CodeType, &lt;STRONG&gt;single select on&lt;/STRONG&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Major group input&lt;/td&gt;&lt;td&gt;Text slicer, &lt;STRONG&gt;no field bound&lt;/STRONG&gt;. It's an input box, not a filter.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Minor group input&lt;/td&gt;&lt;td&gt;Text slicer, no field bound.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Table visual&lt;/td&gt;&lt;td&gt;HotelCodeSetup, showing current state.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Audit visual&lt;/td&gt;&lt;td&gt;vw_HotelCodeSetupHistory, sorted by ChangedDateUtc descending.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Apply button&lt;/td&gt;&lt;td&gt;Action → &lt;STRONG&gt;Data function&lt;/STRONG&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Set both text slicers to &lt;STRONG&gt;Edit interactions → None&lt;/STRONG&gt; against every other visual. Otherwise typing "Rooms Division" into the input box filters the report down to nothing and the user thinks the data vanished.&lt;/P&gt;
&lt;P&gt;Button parameter mapping:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Function parameter&lt;/th&gt;&lt;th&gt;Bind to&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;hotelCodes&lt;/td&gt;&lt;td&gt;Conditional value → [Selected Hotel Codes]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;codeType&lt;/td&gt;&lt;td&gt;Conditional value → [Selected Code Type]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;majorGroup&lt;/td&gt;&lt;td&gt;Major group text slicer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;minorGroup&lt;/td&gt;&lt;td&gt;Minor group text slicer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Turn on &lt;STRONG&gt;Refresh the report automatically&lt;/STRONG&gt; and &lt;STRONG&gt;Auto clear&lt;/STRONG&gt; on the button, and bind the button text to [Apply Button Label].&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;6. Things I learned the hard way&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;Test as a non-author.&lt;/STRONG&gt; Report access and function execute permission are separate grants in Fabric. If they are out of sync, the user gets an opaque error, and the people most likely to hit it are the least equipped to interpret it. Grant your writeback audience Execute on the User Data Functions item explicitly, then log in as one of them and click the button.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Deployment pipelines do not rebind the button.&lt;/STRONG&gt; The button stores a hard reference to a specific workspace, function set, and function. Promote dev to test to prod and it is still pointing at dev, even when an identically named function exists in the target workspace. It will happily write dev data from your prod report. Repoint it manually after every deployment, and put that on the release checklist.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Decide your insert policy deliberately.&lt;/STRONG&gt; @AllowInsert = 1 means editing a code type for a hotel that doesn't currently have one creates the row. That is convenient, and it is also a way for typos to become master data. Pass 0 if setup rows should only ever originate from your master data process.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The analytics endpoint thing.&lt;/STRONG&gt; Worth repeating because it presents as "the button does nothing", which sends you looking in entirely the wrong place.&lt;/P&gt;
&lt;H2&gt;7. Audit queries that earn their keep&lt;/H2&gt;
&lt;LI-CODE lang="sql"&gt;-- Everything one button click did SELECT * FROM audit.vw_HotelCodeSetupHistory WHERE BatchId = '&amp;lt;batch-guid&amp;gt;' ORDER BY HotelCode; -- Full history for one hotel and code type SELECT ChangedDateUtc, ChangedBy, ActionType, ChangeDescription FROM audit.vw_HotelCodeSetupHistory WHERE HotelCode = 'HTL001' AND CodeType = 'FBFOOD' ORDER BY ChangedDateUtc DESC; -- Who is making bulk changes SELECT ChangedBy, COUNT(DISTINCT BatchId) AS Batches, COUNT(*) AS ColumnChanges FROM audit.HotelCodeSetupAudit WHERE ChangedDateUtc &amp;gt;= DATEADD(DAY, -30, SYSUTCDATETIME()) GROUP BY ChangedBy ORDER BY ColumnChanges DESC;&lt;/LI-CODE&gt;
&lt;P&gt;The view builds a readable line per change:&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CONCAT(a.ColumnName, ': ', ISNULL(a.OldValue, '(blank)'), ' -&amp;gt; ', ISNULL(a.NewValue, '(blank)')) AS ChangeDescription&lt;/LI-CODE&gt;
&lt;P&gt;So the audit visual on the report reads &lt;EM&gt;"MajorGroup: Food &amp;amp; Bev -&amp;gt; Food &amp;amp; Beverage"&lt;/EM&gt; rather than making the user mentally diff two columns.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;What's next&lt;/H2&gt;
&lt;P&gt;Because the audit stores old and new values per column and groups them by BatchId, rollback is a replay of OldValue for a given batch. That is the obvious third function to build once the main flow has been stable for a while. I have deliberately not built it yet, on the grounds that an undo button written in week one tends to be the thing that needs undoing.&lt;/P&gt;
&lt;H2&gt;Wrapping up&lt;/H2&gt;
&lt;P&gt;The pattern generalises well beyond hotel codes. Any reference or mapping table that business users maintain, and that currently lives in a spreadsheet somebody emails around, is a candidate. The parts worth copying are the ones that are not obvious from the tutorials:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Surrogate PK plus a unique constraint on the real business key, so bulk editing is possible at all.&lt;/LI&gt;
&lt;LI&gt;Audit inside the procedure rather than in a trigger, so the identity is the report user.&lt;/LI&gt;
&lt;LI&gt;COALESCE in the update so blank means "leave alone", not "erase".&lt;/LI&gt;
&lt;LI&gt;ISFILTERED in the DAX so an empty slicer can't rewrite everything.&lt;/LI&gt;
&lt;LI&gt;A hard cap on selection size in the function.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;EM&gt;Happy to answer questions in the comments. If you have built something similar and solved the deployment pipeline rebinding problem more elegantly than "remember to do it manually", I would genuinely like to hear it.&lt;/EM&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;PBIX File &amp;amp; full scripts: 01_schema_and_procs.sql and 02_user_data_function.py are attached below.&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 17:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/One-button-fifty-rows-bulk-write-back-from-Power-BI-to-Fabric/ba-p/5364356</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-10T17:00:00Z</dc:date>
    </item>
    <item>
      <title>You Can Create Calculated DAX Columns in Direct Lake — But Should You?</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/You-Can-Create-Calculated-DAX-Columns-in-Direct-Lake-But-Should/ba-p/5365681</link>
      <description>&lt;P&gt;Adding calculated columns in DAX for Direct Lake gives a lot of flexibility and feels like an easy option... BUT.....&lt;/P&gt;</description>
      <pubDate>Wed, 09 Sep 2026 14:03:44 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/You-Can-Create-Calculated-DAX-Columns-in-Direct-Lake-But-Should/ba-p/5365681</guid>
      <dc:creator>amitchandak</dc:creator>
      <dc:date>2026-09-09T14:03:44Z</dc:date>
    </item>
    <item>
      <title>Advancing the Microsoft Fabric SQL Query Editor</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Advancing-the-Microsoft-Fabric-SQL-Query-Editor/ba-p/5364033</link>
      <description>&lt;P&gt;The Microsoft Fabric SQL Query Editor is the home for web-based SQL development in Fabric. It gives developers a workspace to explore warehouse data, write and run SQL, among many more capabilities.&lt;/P&gt;
&lt;P&gt;That work rarely starts and ends with a single query. Developers navigate large schemas, author and refine SQL, inspect results, share findings, and connect validated work to downstream analytics and operational workflows. As warehouses and teams grow, each of those steps can introduce friction, from finding the right object, to managing an increasing number of queries or moving between different Fabric experiences.&lt;/P&gt;
&lt;P&gt;The latest SQL query editor updates are focused on reducing that friction and making the development experience faster, more scalable, and more connected across Fabric.&lt;/P&gt;
&lt;H2&gt;A scalable editor for any size warehouse&lt;/H2&gt;
&lt;P&gt;Working with a warehouse becomes harder when the development tools do not scale with the environment.&lt;/P&gt;
&lt;P&gt;Large schemas can make objects difficult to navigate, metadata-heavy environments can slow down authoring assistance, and large query results can become cumbersome to inspect in the browser.&lt;/P&gt;
&lt;P&gt;The latest updates strengthen the core web SQL query editor experiences across Object Explorer, IntelliSense, and the results grid so developers can stay productive as their warehouse grows.&lt;/P&gt;
&lt;P&gt;To learn more about the rich capabilities the SQL query editor offers, explore the&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/sql-query-editor" target="_blank" rel="noopener"&gt;SQL query editor documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;A faster, more capable data grid (Generally Available)&lt;/H3&gt;
&lt;P&gt;Running a query is only useful if developers can quickly understand the output.&lt;/P&gt;
&lt;P&gt;Large or wide result sets can be difficult to inspect when the grid is slow or when values do not fit comfortably on screen, often pushing developers to export data just to review it.&lt;/P&gt;
&lt;P&gt;The brand-new data grid improves performance and makes data and result previews easier to inspect directly in the web SQL query editor. Developers can resize columns for wide result sets, while expanded support for larger LOB data types makes it possible to review larger values directly in the grid, with many more improvements coming soon.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Brand new results grid, now with support for resizing columns.&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;For additional information regarding the data grid, refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/data-preview" target="_blank" rel="noopener"&gt;Data preview documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;Object explorer built for large databases (Generally Available)&lt;/H3&gt;
&lt;P&gt;Finding the right table, view, or schema should not become harder simply because a warehouse contains thousands of objects.&lt;/P&gt;
&lt;P&gt;The redesigned object explorer is significantly optimized for performance when navigating large warehouse environments while keeping schema browsing responsive as the number of objects grows.&lt;/P&gt;
&lt;P&gt;Developers can also pin frequently used tables, views, and schemas, reducing the need to repeatedly navigate through large object hierarchies during everyday development.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - New object explorer (left) vs. old object explorer (right) loading times for thousands of user objects.&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;To learn more, refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/manage-objects" target="_blank" rel="noopener"&gt;Object explorer documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;IntelliSense, redesigned for scale (Generally Available)&lt;/H3&gt;
&lt;P&gt;SQL authoring becomes increasingly dependent on good database context as schemas grow. Developers should not need to remember every table, column, or object name before they can start writing a query. With improved IntelliSense responsiveness in larger warehouse environments, developers can spend less time looking up object names and more time building and refining their queries.&lt;/P&gt;
&lt;H2&gt;Better query management for development workflows&lt;/H2&gt;
&lt;P&gt;The number of queries developers work with tends to grow alongside the warehouse.&lt;/P&gt;
&lt;P&gt;Exploratory queries become reusable queries. Saved SQL queries accumulate across projects. Queries need to be shared for team review, revisited later, or cleaned up once they are no longer useful.&lt;/P&gt;
&lt;P&gt;New query management capabilities make that ongoing work easier to maintain directly within the query editor.&lt;/P&gt;
&lt;H3&gt;Copy and share queries with their context (Preview)&lt;/H3&gt;
&lt;P&gt;Sharing SQL often means separately copying the query, capturing its output, and explaining which results came from which version of the logic.&lt;/P&gt;
&lt;P&gt;The new copy query experience makes it easier to keep those pieces together.&lt;/P&gt;
&lt;P&gt;Developers can copy a query together with its results or generate a link that opens the query directly in the tool of their choice. This makes reviews, validation, and collaboration easier while reducing the extra steps required to pick the work back up in another experience.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Copy query experience in the SQL query editor.&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;More control with autosave (Generally Available)&lt;/H3&gt;
&lt;P&gt;Not every SQL editing session represents work a developer wants to preserve in the same way. Exploratory changes may be temporary, while active development may need to be continuously protected from accidental loss.&lt;/P&gt;
&lt;P&gt;Developers can now toggle autosave on or off, giving them more control over how changes are preserved based on the way they are working.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Autosave on/off configuration in SQL query editor.&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;Manage queries at scale (Generally Available)&lt;/H3&gt;
&lt;P&gt;Saved queries can quickly accumulate across ongoing development, investigation, and experimentation. Managing them one at a time becomes increasingly tedious as that collection grows.&lt;/P&gt;
&lt;P&gt;Bulk query management makes it easier to select and manage multiple queries at once, helping developers clean up old work and keep their query collections organized as projects evolve.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Bulk management capabilities for queries.&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;Import and export .sql files (Generally Available)&lt;/H3&gt;
&lt;P&gt;SQL development often extends beyond a single tool or environment. Developers may already have queries stored as .sql files or need to move work between Fabric and other parts of their development workflow.&lt;/P&gt;
&lt;P&gt;The SQL query editor now supports importing .sql files directly for editing, sharing and execution, as well as exporting queries as .sql files for use elsewhere.&lt;/P&gt;
&lt;P&gt;This makes it easier to bring existing SQL into Fabric, preserve work in a portable format, and move queries between tools without manually copying and pasting code.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Export queries as .sql files from the SQL query editor for development in other tools.&lt;/P&gt;
&lt;/img&gt;
&lt;H2&gt;Extending SQL into analytics, semantics, and operations&lt;/H2&gt;
&lt;P&gt;SQL development often produces the starting point for work that continues elsewhere.&lt;/P&gt;
&lt;P&gt;A developer may validate warehouse data in SQL and then need to analyze it with another engine, connect it to a semantic model, or use the result as part of an ongoing monitoring workflow. Moving between these experiences can interrupt the development flow and create additional steps between understanding the data and doing something with it.&lt;/P&gt;
&lt;P&gt;New integrations make those transitions more direct from the SQL query editor.&lt;/P&gt;
&lt;H3&gt;Analyze warehouse data across OneLake (Generally Available)&lt;/H3&gt;
&lt;P&gt;Different analytical problems often call for different tools.&lt;/P&gt;
&lt;P&gt;A developer may begin by exploring warehouse data with SQL but later need Spark for broader data processing or KQL for another analytical scenario. Traditionally, moving between engines can also introduce additional data movement or setup.&lt;/P&gt;
&lt;P&gt;Directly from the SQL query editor, developers can now create Eventhouse endpoints or notebooks that work with the same warehouse data using KQL or Spark. This makes it easier to choose the engine that best fits the task while staying connected to the same data in OneLake. Learn more about OneLake analytics in the &lt;A href="https://learn.microsoft.com/fabric/real-time-intelligence/eventhouse-as-endpoint" target="_blank" rel="noopener"&gt;Eventhouse endpoint documentation&lt;/A&gt;.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Create Notebooks and Eventhouse Endpoints directly from the SQL query editor for Spark and KQL based analysis on warehouse data.&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;To learn more about OneLake analytics, refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/real-time-intelligence/eventhouse-as-endpoint" target="_blank" rel="noopener"&gt;Eventhouse endpoint documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;Connect SQL to the semantic layer (Generally Available)&lt;/H3&gt;
&lt;P&gt;Validated SQL and warehouse data frequently become the foundation for downstream reporting and BI.&lt;/P&gt;
&lt;P&gt;Without a direct path into semantic modeling, developers and BI teams often must leave the web SQL Query Editor and start that workflow separately, even when they are working from the same underlying warehouse data.&lt;/P&gt;
&lt;P&gt;Developers now have the option to create a Direct Lake over OneLake semantic model directly from the SQL query editor, making it easier to move from exploring and validating warehouse data into building a semantic model without extra navigation or setup.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Create Direct Lake semantic models from the SQL query editor.&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;To learn more about creating semantic models on warehouse data, refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/create-semantic-model" target="_blank" rel="noopener"&gt;Power BI semantic model documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;Turn SQL queries into operational workflows with Fabric Activator (Preview)&lt;/H3&gt;
&lt;P&gt;Developers often rerun the same SQL queries to monitor changing conditions and catch issues that need attention. That creates repetitive work for developers and operators who need to continually inspect business conditions or workload signals.&lt;/P&gt;
&lt;P&gt;The new Fabric Activator integration, now in preview, makes those SQL queries in warehouse more operational. Developers can define conditions based on query results and trigger follow-up actions when those conditions are met. Instead of repeatedly running SQL to look for an issue, the query can become part of an ongoing workflow that surfaces when attention or action is needed.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;Figure: Animated GIF - Creating an alert on a SQL query.&lt;/img&gt;
&lt;P&gt;To learn more, refer to the&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/real-time-intelligence/data-activator/set-alerts-warehouse-sql-query" target="_blank" rel="noopener"&gt;alert rule documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;A more complete web SQL query editor experience&lt;/H2&gt;
&lt;P&gt;These updates are designed around a simple idea: developers should spend more time working with their data and less time working around their tools.&lt;/P&gt;
&lt;P&gt;Faster navigation and authoring reduce friction in large warehouse environments. Better query management makes ongoing SQL development easier to maintain. Deeper Fabric integrations reduce the distance between writing a query and using that work across analytics, semantic models, and operational workflows.&lt;/P&gt;
&lt;P&gt;Together, these capabilities make the SQL query editor a more complete development experience for working with warehouse data, from finding the right object and writing SQL to validating results and carrying that work forward across Fabric.&lt;/P&gt;
&lt;P&gt;Ready to get started? Refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/sql-query-editor" target="_blank" rel="noopener"&gt;SQL query editor documentation.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This is just the start of a series of rich investments to make the Microsoft Fabric SQL Query Editor an even more powerful and productive environment for web-based SQL development in Fabric, with many more capabilities coming soon. Stay tuned!&lt;/P&gt;</description>
      <pubDate>Tue, 08 Sep 2026 19:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Advancing-the-Microsoft-Fabric-SQL-Query-Editor/ba-p/5364033</guid>
      <dc:creator>salilkanade1</dc:creator>
      <dc:date>2026-09-08T19:00:00Z</dc:date>
    </item>
    <item>
      <title>Building and Enriching a Microsoft Fabric Data Agent on a Power BI Semantic Model</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Building-and-Enriching-a-Microsoft-Fabric-Data-Agent-on-a-Power/ba-p/5364459</link>
      <description>&lt;P&gt;Microsoft Fabric’s Data Agents are one of the most exciting additions to the Fabric ecosystem for Power BI practitioners. They let business users ask questions in plain English and receive grounded answers directly from a governed semantic model, without needing to write DAX or SQL.&lt;BR /&gt;&lt;BR /&gt;In this post, I’ll explain why you might place a Data Agent on top of a Power BI semantic model, how to set one up, and, most importantly, how to enrich it so it provides high-quality, trustworthy answers.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;The big idea:&lt;/STRONG&gt; Business users ask questions in plain English. The agent reasons over a curated semantic layer and returns grounded, governed answers rather than invented results.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;1. What Are Data Agents, and Why Use Them?&lt;/H2&gt;&lt;P&gt;Data Agents let people ask plain-English questions about their data and receive context-rich answers. Under the hood, they use Azure OpenAI models to interpret the question, determine which data source is most relevant, and generate an appropriate query: SQL for a warehouse or lakehouse, DAX for a semantic model, and KQL for event data.&lt;BR /&gt;&lt;BR /&gt;The result is presented as a readable response containing tables, summaries, or insights while respecting the user’s existing security permissions. Because Data Agents connect directly to governed data in OneLake, they make analytics accessible to users who may never open Power BI Desktop or write a query.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H3&gt;1.1 What Is the Difference Between Copilot and a Data Agent?&lt;/H3&gt;&lt;P&gt;Both Fabric Copilot and Fabric Data Agents use generative AI, but they are designed for different scenarios.&lt;BR /&gt;&lt;BR /&gt;Copilot is embedded within the current Fabric experience, such as a Power BI report, and helps users complete context-specific tasks such as creating visuals or writing DAX. A Data Agent is a standalone conversational analytics experience that can connect to as many as five data sources and can be integrated with experiences such as Microsoft Teams, Microsoft 365 Copilot, Copilot Studio, and custom applications.&lt;BR /&gt;&lt;BR /&gt;Data Agents support custom instructions, business terminology, verified answers, and reusable integrations. They are read-only and honor existing security. This makes them suitable for domain-specific, governed self-service analytics, while Copilot remains useful for assistance within the current Fabric item.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;2. Prerequisites and Setup&lt;/H2&gt;&lt;P&gt;To create a Data Agent, you need Fabric capacity and at least one supported data source containing data, such as a lakehouse, warehouse, Power BI semantic model, KQL database, mirrored database, or ontology.&lt;BR /&gt;&lt;BR /&gt;You should also have a well-designed Power BI semantic model with governed measures, meaningful relationships, clear naming, and appropriate security. Cross-geo processing must be enabled when your data is stored in a different region. Read permission on the semantic model is sufficient; Build permission is not required.&lt;/P&gt;&lt;H2&gt;3. Preparing the Semantic Model: The Most Important Step&lt;/H2&gt;&lt;P&gt;Preparing the semantic model is the foundation of a reliable Data Agent. Before adding the model to the agent, configure it using Power BI’s &lt;STRONG&gt;Prep for AI&lt;/STRONG&gt; capabilities.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;STRONG&gt;Use business-friendly names.&lt;/STRONG&gt; Give tables, columns, and measures clear names. Hide technical keys, housekeeping fields, and other objects that users should not query.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Organize the model.&lt;/STRONG&gt; Group related columns and measures into display folders, such as Customer, Sales, Profit, and Time Intelligence.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Add descriptions and synonyms.&lt;/STRONG&gt; Explain what each important table, column, and measure represents, and include the terminology users are likely to use.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Validate relationships.&lt;/STRONG&gt; Ensure the model has the correct active relationships, filter direction, and date behavior.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Apply security.&lt;/STRONG&gt; Configure RLS and OLS where required. The Data Agent respects the semantic model’s security.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Configure Prep for AI.&lt;/STRONG&gt; Define the AI data schema, semantic-model instructions, and verified answers. When a Data Agent queries a semantic model, its DAX-generation tool relies on the model metadata and Prep for AI configuration. Data Agent-level instructions are not used to generate DAX, so model-specific calculation and filtering rules must live in the semantic model.&lt;/LI&gt;&lt;/OL&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;4. Creating and Configuring the Data Agent&lt;/H2&gt;&lt;P&gt;In your Fabric workspace, select &lt;STRONG&gt;New item&lt;/STRONG&gt;, choose &lt;STRONG&gt;Fabric data agent&lt;/STRONG&gt;, give the agent a descriptive name, and create it. The OneLake catalog will appear, allowing you to add supported data sources. Select the Power BI semantic model and any other required sources, then choose only the tables the agent needs for the intended business questions.&lt;/P&gt;&lt;H3&gt;4.1 Configuring the Data Agent&lt;/H3&gt;&lt;P&gt;Creating the agent is only the starting point. To improve accuracy and keep the experience useful over time, treat it as an evolving system and use an iterative process of testing and refinement.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;1. Add Data Agent instructions.&lt;/STRONG&gt; These instructions govern orchestration and presentation. Use them to define source-routing priorities, response structure, clarification behavior, business terminology, and how results should be summarized or visualized.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;2. Add semantic-model instructions.&lt;/STRONG&gt; These belong in Prep for AI and explain how AI should understand and query the model. Include governed measures, date rules, relationships, filter logic, definitions, and important safeguards.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;One important separation:&lt;/STRONG&gt; Semantic Model AI Instructions explain how AI should understand the model. Data Agent Instructions explain how the agent should orchestrate and communicate.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;3. Start with a benchmark set.&lt;/STRONG&gt; Build a representative set of business questions with expected queries and answers. Use it to evaluate accuracy and expand coverage systematically.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;4. Diagnose incorrect responses.&lt;/STRONG&gt; Determine whether an incorrect answer was caused by missing metadata, unclear instructions, incomplete examples, an ambiguous user question, or a semantic-model issue.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;5. Refine the instructions.&lt;/STRONG&gt; Clarify data-source priorities, business definitions, date behavior, summary-versus-detail rules, and expected output formatting.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H3&gt;4.2 Best Practices and Recommendations&lt;/H3&gt;&lt;OL&gt;&lt;LI&gt;Use descriptive table, column, and measure names so the agent can understand the schema.&lt;/LI&gt;&lt;LI&gt;Build specialized agents for specific domains and limit each source to the tables and columns needed for that domain.&lt;/LI&gt;&lt;LI&gt;Be explicit about what the agent should do, not only what it should avoid.&lt;/LI&gt;&lt;LI&gt;Define business terms, abbreviations, synonyms, date rules, and important calculation logic.&lt;/LI&gt;&lt;LI&gt;Provide representative verified answers for common and complex questions.&lt;/LI&gt;&lt;LI&gt;Select only the sources and objects needed to answer the expected questions. A focused configuration improves query accuracy and efficiency.&lt;/LI&gt;&lt;LI&gt;Use SQL, DAX, or KQL examples only where they materially clarify complex joins, filters, or date logic.&lt;/LI&gt;&lt;LI&gt;Validate results under different user identities to confirm RLS and OLS behavior.&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;These practices help the Data Agent interpret questions correctly, query the right source, and return clear, context-rich answers.&lt;/P&gt;&lt;H2&gt;5. Enriching and Evolving the Data Agent&lt;/H2&gt;&lt;P&gt;You can enrich the agent with instructions, examples, terminology, and response rules. Data Agent instructions should define tone, routing, clarification, response formatting, and visual policy across sources. Avoid placing semantic-model-specific calculation logic at this level.&lt;BR /&gt;&lt;BR /&gt;Use verified answers to anchor common business questions to the expected interpretation and governed query. As you test the agent, review both the returned result and the generated query. If an answer is incorrect, refine the semantic model metadata, AI data schema, verified answers, or instructions based on the actual cause.&lt;/P&gt;&lt;H3&gt;Evaluate and Iterate with the Fabric Data Agent SDK&lt;/H3&gt;&lt;P&gt;Evaluation is essential to the ongoing development of a Data Agent. Use the Fabric Data Agent SDK to test representative questions at scale, compare actual results with expected answers, and identify patterns in failures.&lt;BR /&gt;&lt;BR /&gt;An effective evaluation set should include common questions, ambiguous questions, unsupported requests, date and comparison scenarios, hierarchy navigation, security-sensitive questions, and follow-up questions that depend on conversational context.&lt;/P&gt;&lt;H3&gt;Add Code Interpreter&lt;/H3&gt;&lt;P&gt;Code Interpreter gives the Data Agent a secure, sandboxed Python environment for analyzing retrieved data. With it enabled, the agent can support calculations, deeper analysis, and visualizations that go beyond the initial query result.&lt;BR /&gt;&lt;BR /&gt;The governed data source should still produce the underlying result first. Code Interpreter should analyze that result rather than recreate business logic outside the semantic model.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;H2&gt;6. How Data Agents Work at Runtime&lt;/H2&gt;&lt;P&gt;When a user asks a question, the Data Agent uses Azure OpenAI to interpret the request and determine the most suitable connected source. It accesses each source under the user’s identity and security context.&lt;BR /&gt;&lt;BR /&gt;For a Power BI semantic model, the agent uses the model’s metadata and Prep for AI configuration to generate and execute a DAX query. It then formats the governed result as a conversational response. Because the query runs under the user’s permissions and honors model and workspace security, the agent only returns information that the user is authorized to access.&lt;/P&gt;&lt;H2&gt;7. Benefits and Limitations&lt;/H2&gt;&lt;P&gt;Data Agents make governed analytics more accessible by reducing the need for users to write queries or build a report for every question. They can bring multiple supported data sources into one conversational experience while honoring existing security and governance.&lt;BR /&gt;&lt;BR /&gt;However, a Data Agent is not automatically accurate simply because it is connected to trusted data. Its results depend on semantic-model quality, relevant metadata, clear instructions, verified answers, focused source selection, and continuous evaluation. Complex root-cause or predictive questions may also require additional analytical logic beyond a straightforward governed query.&lt;/P&gt;&lt;H2&gt;8. Conclusion&lt;/H2&gt;&lt;P&gt;Microsoft Fabric Data Agents provide a powerful new way to interact with enterprise data. By combining a well-prepared Power BI semantic model with focused Data Agent configuration, verified answers, clear instructions, and ongoing evaluation, you can create a conversational analytics experience that users can trust.&lt;BR /&gt;&lt;BR /&gt;The goal is not merely to connect AI to data. The goal is to connect AI to governed business meaning.&lt;/P&gt;&lt;H5&gt;Further Reading -&amp;nbsp;&lt;/H5&gt;&lt;P&gt;&lt;A href="https://community.fabric.microsoft.com/blog/community_blog/why-your-fabric-data-agent-gives-wrong-answers-and-how-data-enrichment-fixes-it/5361211" target="_blank"&gt;Why Your Fabric Data Agent Gives Wrong Answers (And How Data Enrichment Fixes It)&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 08 Sep 2026 13:46:21 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Building-and-Enriching-a-Microsoft-Fabric-Data-Agent-on-a-Power/ba-p/5364459</guid>
      <dc:creator>Praful_Potphode</dc:creator>
      <dc:date>2026-09-08T13:46:21Z</dc:date>
    </item>
  </channel>
</rss>

