Forum Discussion
Using a C# script in Tabular Editor 2 to update M code - error message
- 8 months ago
Hi arc_gts,
Thank you for contacting the Microsoft Fabric Community Forum.
Based on my understanding, the issue is unlikely to be caused by Tabular Editor, C# scripts, or SQL connectivity. The save failure occurs because invalid Power Query (M) syntax is introduced during the TSV export/edit/import process, and Power BI validates M code only at save/deploy time using the Mashup engine. Specifically, manually replacing line breaks or tabs with #(lf) / #(tab), embedding multi-line SQL inside Query="...", or introducing encoding/escaping changes while editing the TSV can produce invalid serialized M code and trigger the “Microsoft.Data.Mashup.Preview;Token identifier expected” error.
The safest approach is to avoid embedding raw SQL text and instead rebuild the M expression using native Power Query navigation, for example, Sql.Database followed by schema or table navigation. This eliminates string escaping issues and is fully validated and supported by the Mashup engine:
let
Source = Sql.Database("localhost\SQLEXPRESS", "AdventureWorks2025"),
Product = Source{[Schema="Production", Item="Product"]}[Data]
in
ProductIf embedding SQL text is unavoidable, ensure it remains single line, avoid #(lf) / #(tab) inside strings, preserve actual line breaks in the M script, and validate each updated query first in Power BI Desktop via Transform data → Advanced Editor before applying bulk changes. Once the M syntax is valid there, saving from Tabular Editor should succeed.
Please refer to the links below for further information:
Power Query M language specification - PowerQuery M | Microsoft Learn
Sql.Database - PowerQuery M | Microsoft Learn
External Tools in Power BI Desktop - Power BI | Microsoft Learn
Tabular modeling overview - Analysis Services | Microsoft LearnWe hope the above guidance helps resolve the issue. If you have any further queries, please feel free to contact the Microsoft Fabric community.
Thank you.
Hi arc_gts,
Thank you for contacting the Microsoft Fabric Community Forum.
Based on my understanding, the issue is unlikely to be caused by Tabular Editor, C# scripts, or SQL connectivity. The save failure occurs because invalid Power Query (M) syntax is introduced during the TSV export/edit/import process, and Power BI validates M code only at save/deploy time using the Mashup engine. Specifically, manually replacing line breaks or tabs with #(lf) / #(tab), embedding multi-line SQL inside Query="...", or introducing encoding/escaping changes while editing the TSV can produce invalid serialized M code and trigger the “Microsoft.Data.Mashup.Preview;Token identifier expected” error.
The safest approach is to avoid embedding raw SQL text and instead rebuild the M expression using native Power Query navigation, for example, Sql.Database followed by schema or table navigation. This eliminates string escaping issues and is fully validated and supported by the Mashup engine:
let
Source = Sql.Database("localhost\SQLEXPRESS", "AdventureWorks2025"),
Product = Source{[Schema="Production", Item="Product"]}[Data]
in
Product
If embedding SQL text is unavoidable, ensure it remains single line, avoid #(lf) / #(tab) inside strings, preserve actual line breaks in the M script, and validate each updated query first in Power BI Desktop via Transform data → Advanced Editor before applying bulk changes. Once the M syntax is valid there, saving from Tabular Editor should succeed.
Please refer to the links below for further information:
Power Query M language specification - PowerQuery M | Microsoft Learn
Sql.Database - PowerQuery M | Microsoft Learn
External Tools in Power BI Desktop - Power BI | Microsoft Learn
Tabular modeling overview - Analysis Services | Microsoft Learn
We hope the above guidance helps resolve the issue. If you have any further queries, please feel free to contact the Microsoft Fabric community.
Thank you.
- arc_gts8 months agoFrequent Visitor
Thanks, this is very helpful. While it's not the answer I was hoping for, now I know that it won't be productive to pursue this method of updating my semantic model any further.