Sql server 从SQL查询向SSAS发送XMLA DISCOVER_XML_元数据
我试图向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下不允许” 那么,你知道怎么做吗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
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”