【问题标题】:Sending XMLA DISCOVER_XML_METADATA to SSAS from an SQL query从 SQL 查询将 XMLA DISCOVER_XML_METADATA 发送到 SSAS
【发布时间】:2021-03-08 02:30:45
【问题描述】:

我正在尝试向 Analysis Services 实例发出用于“发现”的 XMLA 语句。从 Management Studio 中的 XMLA 窗口发送 XMLA 可以正常工作并返回所需的结果,所以我相信我的基本语法是正确的。

将它包装在一个 SQL 查询中(见下文),它会返回: "链接服务器 "ANALYSIS" 的 OLE DB 提供程序 "MSOLAP" 返回消息 "Das Discover-Element in Zeile 2, Spalte 58 (urn:schemas-microsoft-com:xml-analysis-Namespace) ist unter Envelope/Body/执行/命令/批处理 nicht zulässig."

自己的翻译:“第 2 行第 58 列中的 Discover-Element ... 位于 Envelope/Body/Execute/Command/Batch ... 下...不允许。”。

我关注了SSAS XMLA DISCOVER: how to get list of roles in SSAS database,其中包含一个工作示例和一个屏幕截图。那是 2010 年......所以那里使用的版本很可能是 SQL 2008 或 SQL 2008 R2。 我的代码应该是相同的,但它在 SQL 2012 上不起作用(不再?)。

我什至认为这是正确的,引用https://docs.microsoft.com/de-de/analysis-services/xmla/xml-elements-commands/batch-element-xmla?view=sql-analysis-services-2016: "子元素(Batch):Bindings、DataSource、DataSourceView、ErrorConfiguration、Parallel

以下一个或多个 XMLA 命令:Alter、Backup、BeginTransaction、ClearCache、CommitTransaction、Create、Delete、DesignAggregations、Drop、Insert、Lock、MergePartitions、NotifyTableChange、Process、Restore、RollbackTransaction、SetPasswordEncryptionKey、Statement , 订阅, 同步, 解锁, 更新, UpdateCells"

这里没有提到“发现”是一个有效的命令。 如果没有 Batch,它也不起作用。我当然测试过。上面给出的错误只是更改为“Envelope/Body/Execute/Command 下不允许

那么,知道如何做到这一点吗?

DECLARE @xmla AS NVARCHAR(MAX) = '<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
    <Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
        <RequestType>DISCOVER_XML_METADATA</RequestType>
        <Restrictions>
            <RestrictionList xmlns="urn:schemas-microsoft-com:xml-analysis">
                <DatabaseID>DBName</DatabaseID>
                <CubeID>CubeName</CubeID>
                <MeasureGroupID>MGName</MeasureGroupID>
            </RestrictionList>
        </Restrictions>
        <Properties/>
    </Discover>
</Batch>';

EXEC (@xmla) AT [ANALYSIS_LINKED_SERVER];

【问题讨论】:

  • 如果你浏览微软页面的链接,你会发现“发现”不是一个命令,而是一个方法。 “执行”也是一种方法。如果您从 SQL 执行“EXEC”,那么您已经在“Execute”方法路径下,并且不能“返回”以使用“Discover”方法 - 这是有道理的。但是如何向 SSAS 发布另一种方法呢?我试过 OpenQuery() 但这也返回错误“不允许在命令下”。

标签: sql-server sql-server-2012 ssas linked-server xmla


【解决方案1】:

回答我自己的问题肯定不是很好的风格,但碰巧的是,我似乎找到了一种可以接受的查询数据的方法。我不会接受我的回答,我希望有人在这里找到比我更好的方法。

这个想法是,如果“SQL EXEC”让你在“Envelope-Body-Execute”方法中走得太远,为什么不自己从根开始做 SOAP 并在适当的时候选择“Discover”方法呢?

我主要从这里设置了 SOAP Envelope:Calling a SOAP webservice from TSQL stored procedure,并根据需要对其进行了调整。

我没有设法在 SSAS 本机协议端口(我认为默认为 2383)上调用它,但由于我们运行 msmdpump.dll,这对我来说不是什么大问题。如果有人知道如何将 SOAP 发布到本机端口,我会很高兴听到。

DECLARE @url AS VARCHAR(8000) = 'http://webserver/olap/msmdpump.dll';
DECLARE @requestBody AS VARCHAR(8000) = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
            <RequestType>DISCOVER_XML_METADATA</RequestType>
            <Restrictions>
                <RestrictionList>
                    <DatabaseID>DBID</DatabaseID>
                    <CubeID>CubeID</CubeID>
                    <MeasureGroupID>MGID</MeasureGroupID>
                </RestrictionList>
            </Restrictions>
            <Properties/>
        </Discover>
    </soap:Body>
</soap:Envelope>';

DECLARE @obj AS INT;
EXEC sys.sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT;

EXEC sys.sp_OAMethod @obj, 'Open', NULL, 'POST', @url, false

EXEC sys.sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Type', 'text/xml'
EXEC sys.sp_OAMethod @obj, 'setRequestHeader', NULL, 'SOAPAction', '"urn:schemas-microsoft-com:xml-analysis:Discover"'
EXEC sys.sp_OAMethod @obj, 'send', NULL, @requestBody

CREATE TABLE #t (x XML);
INSERT INTO #t
EXEC sys.sp_OAGetProperty @obj, 'responseText';

EXEC sys.sp_OADestroy @obj;

就是这样 - 对我有用。如果有任何意见或建议,请告诉我!谢谢!

【讨论】:

    猜你喜欢
    • 2014-02-14
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2015-09-16
    • 2023-03-08
    • 2018-03-17
    • 2021-06-12
    相关资源
    最近更新 更多