将文本文件中的多个查询粘贴到 Power BI Desktop

Posted

技术标签:

【中文标题】将文本文件中的多个查询粘贴到 Power BI Desktop【英文标题】:Paste multiple queries from text file into Power BI Desktop 【发布时间】:2021-12-23 18:35:09 【问题描述】:

我正在将 SSAS(SQL Server 分析服务器)表格模型移植到 Power BI Desktop。我在 SSAS 导出(仅在文本文件中)中有大约 200 个查询,我需要将这些查询移至 Power BI。我可以一次将一个查询粘贴到 Power BI 的高级编辑器中,但是对于 200 个查询,这是一个艰难的过程。我正在寻找一种将所有查询一次导入 Power BI Desktop 的方法。

对于 SSAS 专家,这是从 SSAS 迁移表的尝试 4。 尝试 1 是使用 ALM Toolkit,但它不适用于 Power BI Desktop 模型中的表。 尝试 2 是 SSMS 中的 XLMA 脚本,但我什至无法获取为 SSAS 模型生成的脚本以在 SSAS 中运行。我收到如下错误:Query (56,129) The syntax for ')' is wrong. 表格编辑器中的尝试 3 与 SSMS 有相同的问题。

所以对于尝试 4,我想我会尝试将多个查询粘贴到 Power Query 窗口中。如果我将查询从一个 Power BI 文件移动到另一个文件,我可以选择多个查询并在 Power BI 文件之间复制和粘贴它们。如果我查看剪贴板,它看起来像这样:

Format:html Format Version: 1.0 StartHTML: 0 EndHTML: 0 StartFragment: 0 EndFragment: 0 
<?xml version="1.0" encoding="utf-8"?>
<Mashup xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://schemas.microsoft.com/DataMashup">
    <Client>PBIDesktop</Client>
    <Version>2.30.4246.1721</Version>
    <MinVersion>2.21.0.0</MinVersion>
    <Culture>en-US</Culture>
    <SafeCombine>true</SafeCombine>
    <Items>
        <Query Name="Server">
            <Formula><![CDATA["text"]]></Formula>
            <LoadToReport>false</LoadToReport>
            <IsParameterQuery>false</IsParameterQuery>
            <IsDirectQuery xsi:nil="true" />
        </Query>
    ...
    </Items>
</Mashup>

所以我的理论是我可以像这样格式化我的文本文件,将其以 HTML 格式填充到剪贴板中,然后将其粘贴到 Power Query 中。到目前为止,我还无法将它作为 HTML 复制到剪贴板。它只复制为文本。它甚至不会作为文本粘贴到 Power Query 中。它必须是 HTML。

知道如何将我的文本文件转换成这种格式吗?我一直在尝试this Python code,但还没有运气。

如果我可以编辑剪贴板,则另一种选择是。您可以将数据固定在剪贴板历史记录中。如果我能弄清楚它的存储位置,也许我可以在那里添加我的查询?

更新:

我已经放弃了这种方法。 This article 显示剪贴板如何同时复制多种格式。在我有限的测试中,我认为是“Microsoft Mashup 格式”而不是“HTML 格式”需要填充才能粘贴到 Power BI。这也可以解释为什么the header in the HTML Format is not conformant 和Microsoft doesn't care to fix it。

InsideClipboard tool 对于在复制后检查剪贴板以了解 Microsoft 在做什么至关重要。 “Microsoft Mashup 格式”有一个二进制标头,这似乎与 2?改变的字节长度。我的 Python 不足以更改代码,所以我放弃了这种方法。我将把我当前的解决方案放在这篇文章的答案中。

【问题讨论】:

【参考方案1】:

更简单的方法是使用 VBA 宏从 Excel Power Query 中的文本文件创建查询,然后手动复制 Excel 查询以粘贴到 Power BI Desktop。您可以从“查询和连接”窗格或 Power Query 编辑器一次选择 Excel 中的所有查询,然后一次性复制它们。

这是一些用于在新文件中创建查询的 VBA 代码。它要求带有宏的文件在名为“数据源”的工作表上有一个名为“Data_sources”的表,其中至少有 4 列(数据源名称、数据源查询、服务器和数据库):

Sub CreateDataSourceQueries()
    Dim i As Integer
    Dim dswb As Workbook  'New Data Source Workbook
    Dim dst As ListObject 'Table with all data sources
    
    'Create new workbook
    Set dswb = Workbooks.Add
    dswb.ActiveSheet.name = "Data Source Queries"
    dswb.ActiveSheet.Range("A1").Value = "Data Source Queries"
    dswb.ActiveSheet.Range("A2").Value = "Server:"
    dswb.ActiveSheet.Range("A3").Value = "Database:"
    
    'Adding comment because code to set width isn't working
    dswb.ActiveSheet.Range("A5").Value = "To see queries, click: Data > Queries & Connections"
'    With Application.CommandBars("Queries and Connections")
'        .Visible = True
'        .Width = 400     'Doesn't seem to work, but maybe Microsoft will fix it?
'    End With
    
    'Create query in new book for each data source
    Set dst = ThisWorkbook.Sheets("Data sources").ListObjects("Data_sources")
    For i = 1 To dst.DataBodyRange.Rows.Count
        dswb.Queries.Add name:=dst.ListColumns("Data Source Name").DataBodyRange(i), _
                         Formula:=dst.ListColumns("Data Source Query").DataBodyRange(i)
    Next i
    
    'Add info on Server and Database being migrated
    dswb.ActiveSheet.Range("B2").Value = dst.ListColumns("Server Name").DataBodyRange(1)
    dswb.ActiveSheet.Range("B3").Value = dst.ListColumns("Database Name").DataBodyRange(1)
    
End Sub

【讨论】:

以上是关于将文本文件中的多个查询粘贴到 Power BI Desktop的主要内容,如果未能解决你的问题,请参考以下文章

Power BI 中的 M(Power Query),将参数从列表传递到 SQL 语句

忽略 Power BI 查询中的空白调用自定义函数

将excel查询复制到power bi

从 Power BI 桌面/查询中的单元格中提取短语

Power BI Advanced编辑器如何获取SelectedRow的文本?

如何复制 - 将 QStandardItemModel 创建的 QTableView 中的多个项目粘贴到文本/excel 文件中?