在 OpenXML 查询中使用计数



我有一个非常大的XML文档,我正在将其加载到SQL中,然后尝试解析以添加到现有表的末尾。

到目前为止,我的代码是:'

INSERT INTO XMLAttempt1(XMLData, LoadedDateTime)
SELECT CONVERT(XML, Bulkcolumn) AS Bulkcolumn, getdate()
from openrowset(bulk 'filepath.xml', Single_clob) as x;
select * from XMLAttempt1
DECLARE @XML as XML, @hdoc int, @doc nvarchar(MAX); 
SELECT @xml = XMLDATA FROM XMLAttempt1;
EXEC sp_xml_preparedocument @hdoc OUTPUT, @XML;
  Select * 
  FROM  OPENXML (@hdoc, 'CxXMLResults/Query/Result', 1) 
  WITH  (ID     int     '../@id',
    @NodeId     INT     @NodeId',
    ProjectID   int '../../@ProjectId',
    ScanId      int '../../@ScanId');

XML 的格式为:

    <Result NodeId="635920047"  lots of other info>
      <Path ResultId="63592" PathId="47" SimilarityId="-1924977021">
        <PathNode>
         <FileName></FileName>
          <Line>292</Line>
          <Column>82</Column>
          <NodeId>1</NodeId>
          <Name>SelectedValue</Name>
          <Type></Type>
          <Length>13</Length>
          <Snippet>
            <Line>
              <Number>292</Number>
              <Code>  stuff;</Code>
            </Line>
          </Snippet>
        </PathNode>
[next x numbers of PathNode] 
</Path>
</Result> 
<Result NodeId="635920048"
[etc until the next QueryId]

我已经看过这篇文章(计算SQL中XML的子标签数量(,但我无法让它工作,我认为这是因为我尝试使用它的地方 - 我没有正确语法。

DECLARE @XML as XML, @hdoc int, @doc nvarchar(MAX); 
SELECT @xml = XMLDATA FROM XMLAttempt1;
EXEC sp_xml_preparedocument @hdoc OUTPUT, @XML;
  Select * 
  FROM  OPENXML (@hdoc, 'CxXMLResults/Query/Result', 1) 
  WITH  (ID     int '../@id',
    @XML.query('count(@NodeId') INT '@NodeId',
    ProjectID   int '../../@ProjectId',
    ScanId      int '../../@ScanId');

但它在@XML说语法不正确

当前结果:

ID      NodeID       ProjectID  ScanId
427 635920047   20336   63592
427 635920048   20336   63592
427 635920049   20336   63592
427 635920050   20336   63592
427 635920051   20336   63592
427 635920052   20336   63592

我最终想要的是:

ID      Count ofNodes       ProjectID  ScanId
427   6                   20336 63592

任何帮助将不胜感激。

你没有显示足够的XML,所以这需要一些猜测...

但首先:FROM OPENXML已经过时,不应再使用(存在极少数例外(。而是使用 XML 的本机方法。

如前所述,这是疯狂的猜测

SELECT @XML.value('(/CxXMLResults/Query/@id)[1]','nvarchar(max)') AS id
      ,@XML.value('count(/CxXMLResults/Query/Result/@NodeId)','int') AS CountOfNodes
      ,@XML.value('(/CxXMLResults/@ProjectId)[1]','nvarchar(max)') AS ProjectId
      ,@XML.value('(/CxXMLResults/@ScanId)[1]','nvarchar(max)') AS ScanId

一些提示:

  • 向后导航(你用../../做的事情被称为非常慢,尽量避免它。
  • 我假设不涉及命名空间(xmlns="something"(
  • 我假设您向我们展示的XML周围有<CxXMLResults><Query>,并且id,ProjectId和ScanId的值存在于您未显示的部分。
  • 您可能需要调整 XPathes

最新更新