从SQL查询向SSAS发送XMLA DISCOVER_XML_METADATA [英] Sending XMLA DISCOVER_XML_METADATA to SSAS from an SQL query

查看:108
本文介绍了从SQL查询向SSAS发送XMLA DISCOVER_XML_METADATA的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试向Analysis Services实例发出&Quot;DISCOVER";的XMLA语句。从Management Studio的XMLA窗口发送XMLA工作正常,并返回所需的结果,因此我确信基本语法正确。

将其包装在SQL查询中(见下文),它将返回: 链接服务器的OLE DB提供程序&分析&在Zeile 2,Spalte 58(urn:schemas-microsoft-com:xml-analysis-Namespace)中返回的消息&Das Discover-Element位于信封/正文/执行/命令/批处理下。&

自己翻译:第2行第58列中的Discover-Element(&Q;).在信封/正文/执行/命令/批处理下.不允许。&Quot;。

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

我甚至认为这是正确的,引用了https://docs.microsoft.com/de-de/analysis-services/xmla/xml-elements-commands/batch-element-xmla?view=sql-analysis-services-2016: (批处理的)子元素(&QOT;):绑定、数据源、DataSourceView、ErrorConfiguration、Parallel

以下一个或多个XMLA命令:ALTER、BACKUP、BeginTransaction、ClearCach、CommomTransaction、Create、Delete、DesignAggregations、Drop、Insert、Lock、MergePartitions、NotifyTableChange、Process、Restore、RollbackTransaction、SetPasswordEncryptionKey、Statement、Subscribe、同步、Unlock、Update、UpdateCells &p>";Discover";未在此处作为有效命令提及。 没有批次,它也不能工作。当然,我对此进行了测试。在信封/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;将您放在";Entaine-Body-Execute&Quot;方法中太深的地方,为什么不自己从根开始执行SOAP,而在合适的时候选择&Quot;Discover&Quot;方法呢?

我主要从以下位置设置SOAP信封:Calling a SOAP webservice from TSQL stored procedure并根据需要对其进行了调整。

我没有设法在SSAS本地协议端口(我认为2383是默认端口)上调用它,但是由于我们运行msmdump.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;

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

这篇关于从SQL查询向SSAS发送XMLA DISCOVER_XML_METADATA的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆