本文介紹了從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的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,