Sql server 从SQL查询向SSAS发送XMLA DISCOVER_XML_元数据

Sql server 从SQL查询向SSAS发送XMLA DISCOVER_XML_元数据,sql-server,sql-server-2012,ssas,linked-server,xmla,Sql Server,Sql Server 2012,Ssas,Linked Server,Xmla,我试图向AnalysisServices实例发出“discover”的XMLA语句。从ManagementStudio中的XMLA窗口发送XMLA效果很好,并返回所需的结果,因此我确信基本语法正确 将其包装在SQL查询中(请参见下文)将返回: 链接服务器“分析”的OLE DB提供程序“MSOLAP”返回消息“Zeile 2中的Das Discover元素,Spalte 58(urn:schemas microsoft com:xml分析命名空间)是unter Envelope/Body/Exec

我试图向AnalysisServices实例发出“discover”的XMLA语句。从ManagementStudio中的XMLA窗口发送XMLA效果很好,并返回所需的结果,因此我确信基本语法正确

将其包装在SQL查询中(请参见下文)将返回: 链接服务器“分析”的OLE DB提供程序“MSOLAP”返回消息“Zeile 2中的Das Discover元素,Spalte 58(urn:schemas microsoft com:xml分析命名空间)是unter Envelope/Body/Execute/Command/Batch nicht zulässig。”

自己的翻译:“第2行第58列中的Discover元素。。。在信封/正文/执行/命令/批处理下。。。不允许。”

我遵循的是一个工作示例和一个屏幕截图。那是2010年…所以那里使用的版本很可能是SQL 2008或SQL 2008 R2。 我的代码应该是相同的,但它在SQL 2012上不起作用(不再?)

我甚至认为这是正确的,引用: (批处理的)子元素:绑定、数据源、数据源视图、错误配置、并行

以下一个或多个XMLA命令:Alter、Backup、BeginTransaction、ClearCache、CommitTransaction、Create、Delete、DesignAggregations、Drop、Insert、Lock、MergePartitions、NotifyTableChange、Process、Restore、RollbackTransaction、SetPasswordEncryptionKey、Statement、Subscribe、Synchronize、Unlock、UpdateCells”

这里没有提到“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];
将@xmla声明为NVARCHAR(MAX)='
发现XML元数据
数据库名称
立方胺
MGName
';
[ANALYSIS_LINKED_SERVER]上的EXEC(@xmla);

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

其想法是,如果“SQLExec”将您置于“信封体执行”方法的较低位置,为什么不自己从根目录执行SOAP,并在适当的时候选择“Discover”方法呢

我主要从这里开始设置SOAP信封:并根据需要进行调整

我没有设法在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;
将@url声明为VARCHAR(8000)='http://webserver/olap/msmdpump.dll';
将@requestBody声明为VARCHAR(8000)='
发现XML元数据
DBID
库贝德
MGID
';
声明@obj为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
创建表#t(x XML);
插入#t
EXEC sys.sp_OAGetProperty@obj,“responseText”;
EXEC sys.sp_OADestroy@obj;

就是这样-对我有效。如果有任何评论或建议,请让我知道!谢谢!

如果您浏览Microsoft页面的链接,您会发现“发现”不是一个命令,而是一个方法。“执行”也是一个方法。如果您从SQL执行“EXEC”,您已经进入了“执行”方法路径,无法“返回”使用“发现”“取而代之的是方法——这是有道理的。那么,如何向SSAS发布另一种方法呢?我尝试了OpenQuery(),但也返回了错误“under command not allowed”