Использование Count в запросе OpenXML - PullRequest
1 голос
/ 05 июня 2019

У меня есть очень большой 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]

Я видел этот пост ( Подсчитайте числовложенных тегов из XML в 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

любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 06 июня 2019

Вы недостаточно показываете свой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...