SQL 服务器 XML 多个节点名称相同的文件

SQL Server XML file with multiple nodes named the same

我有这个内部 XML,我正在将其传递给 SQL 服务器存储过程。

如您所见,它包含多个 root 个节点,但另外,它还可以包含 1 到 'n' 个 LotResults 个子节点。

有没有一种方法可以在存储过程中对其进行操作,以便我可以为每个 root 节点检索所有 LotResults/Result 节点?

到目前为止我已经声明了可以处理顶级节点的cursor

DECLARE cur CURSOR FOR
   SELECT tab.col.value('ID[1]','NCHAR(10)') as INT_TransactionID,
          tab.col.value('ResultDateTime[1]','INT') as DAT_ResultDateTime,
          tab.col.value('StandardComment[1]/ID[1]','BIT') as INT_StandardCommentID,
          tab.col.value('ReviewComment[1]/ID[1]','BIT') as INT_ReviewCommentID
     FROM @XML_Results.nodes('/roots/root') AS tab(col)

     OPEN cur
-- loop over nodes within xml document and populate declared variables
    FETCH 
     NEXT 
     FROM cur

     INTO @INT_TransactionID, 
          @DAT_ResultDateTime, 
          @INT_StandardCommentID, 
          @INT_ReviewCommentID 

    WHILE @@FETCH_STATUS = 0
    BEGIN

    BEGIN
    -- use my values here

      END

    -- fetch next record
    FETCH 
     NEXT 
     FROM cur
     INTO @INT_TransactionID, 
          @DAT_ResultDateTime, 
          @INT_StandardCommentID, 
          @INT_ReviewCommentID 

      END

    CLOSE cur;

注意:我发现了一个描述 how to extract nodes with the same name 的 post,我觉得它可以用来实现我在这里想要做的事情,但我需要一些关于如何实现的指导适用于我的场景。

没有光标!游标是由魔鬼创造的,目的是引导可怜的小数据库人远离基于集合的思维之光,深入到程序方法的黑暗领域...

请(对于以后的问题):不要粘贴图片!必须输入我的示例...

顺便说一句:您在这里使用我的价值观 很难提出正确的建议。根据你在那里做什么,实际上可能需要一个游标。但在这种情况下,您应该像我向您展示的那样从查询创建游标...

这样试试:

DECLARE @xml XML=
'<roots>
  <root>
    <ID>5</ID>
    <LotResults>
      <ID>13</ID>
      <Result>
        <ID>5</ID>
        <Count>2</Count>
      </Result>
    </LotResults>
    <LotResults>
      <ID>13</ID>
      <Result>
        <ID>5</ID>
        <Count>2</Count>
      </Result>
    </LotResults>
    <StandardComment>
      <ID>0</ID>
    </StandardComment>
    <ReviewComment>
      <ID>0</ID>
    </ReviewComment>
  </root>
  <root>
    <ID>44</ID>
    <LotResults>
      <ID>444</ID>
      <Result>
        <ID>4444</ID>
        <Count>2</Count>
      </Result>
    </LotResults>
    <LotResults>
      <ID>555</ID>
      <Result>
        <ID>55</ID>
        <Count>2</Count>
      </Result>
    </LotResults>
    <StandardComment>
      <ID>5</ID>
    </StandardComment>
    <ReviewComment>
      <ID>5</ID>
    </ReviewComment>
  </root>
</roots>';

--这是查询

SELECT r.value('ID[1]','int') AS root_ID
      ,lr.value('ID[1]','int') AS LotResult_ID
      ,lr.value('(Result/ID)[1]','int') AS LotResult_Result_ID
      ,lr.value('(Result/Count)[1]','int') AS LotResult_Result_Count
      ,r.value('(StandardComment/ID)[1]','int') AS StandardComment_ID 
      ,r.value('(ReviewComment/ID)[1]','int') AS ReviewComment_ID 
FROM @xml.nodes('/roots/root') AS A(r)
CROSS APPLY r.nodes('LotResults') AS B(lr)