【问题标题】:Using a Count within an OpenXML query在 OpenXML 查询中使用计数
【发布时间】:2019-06-05 12:52:46
【问题描述】:

我有一个非常大的 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]

我看过这篇文章 (Count the number of sub tags from XML in SQL),但我无法让它工作,我认为这是因为我试图使用它 - 我的语法不正确。

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

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server xml tsql


    【解决方案1】:

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

    但首先:FROM OPENXML 已过时,不应再使用(存在罕见的例外情况)。而是使用XML's native methods

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

    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 周围存在 &lt;CxXMLResults&gt;&lt;Query&gt;,并且 id、ProjectId 和 ScanId 的值存在于您未展示的部分中。
    • 您可能需要调整 XPathes

    【讨论】:

    • 嗨 - 谢谢!我找出了我做错了什么——我不能在 openXML 中进行计数,因为它没有存储在表中——所以我将它解析到一个临时表中,然后从那里进行计数并复制到我的实际表中。我所做的所有谷歌搜索都说要使用 OpenXML,所以我会研究 XML 值的东西 - 感谢链接 :) 我现在已经可以使用它了,但是如果我可以让它变得更精简和更快,那就是胜利!
    • @BeckyG 好吧,如果它适合你,你可以这样做。如果这是一个一次性操作,那么你如何解决这个问题并不重要。但是FROM OPENXML 方法——当然——不是这里的最佳选择。原生 XML 方法在性能和机器压力方面会好得多...
    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多