从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;
就是这样-对我很管用。如果您有任何意见或建议,请告诉我!谢谢!
相关文章