T-SQL 流程自定义 XML

T-SQL process custom XML

我需要帮助来处理自定义 XML。我在下面放了一段摘录,我希望获得所有这些用蓝线标记的值。我很困惑,因为每个的属性可能不同。我还附上完整的 运行 测试代码。

我尝试了我知道的不同方法,但供应商更改了模式,现在我无法弄明白。

非常感谢。

也希望获得所有这些值

用蓝线标记:

我刚收到这个 运行 代码,但它还不能正常工作,

DECLARE @xml XML = ('<Submission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Measures>
    <A100 versionID="A01">
      <Metadata>
        <TY_Year>2020</TY_Year>
        <Benefit>true</Benefit>
      </Metadata>
      <AnnualCount>
        <Stratification>
          <Pool>11-14</Pool>
        </Stratification>
        <Data>
          <RegTotal>13071</RegTotal>
          <CountA>542</CountA>
        </Data>
      </AnnualCount>
      <AnnualCount>
        <Stratification>
          <Pool>15-18</Pool>
        </Stratification>
        <Data>
          <RegTotal>12016</RegTotal>
          <CountA>458</CountA>
        </Data>
      </AnnualCount>
      <AnnualCount>
        <Stratification>
          <Pool>19-20</Pool>
        </Stratification>
        <Data>
          <RegTotal>4591</RegTotal>
          <CountA>129</CountA>
        </Data>
      </AnnualCount>
      <AnnualCount>
        <Stratification>
          <Pool>2-3</Pool>
        </Stratification>
        <Data>
          <RegTotal>5649</RegTotal>
          <CountA>127</CountA>
        </Data>
      </AnnualCount>
      <AnnualCount>
        <Stratification>
          <Pool>4-6</Pool>
        </Stratification>
        <Data>
          <RegTotal>8995</RegTotal>
          <CountA>366</CountA>
        </Data>
      </AnnualCount>
      <AnnualCount>
        <Stratification>
          <Pool>7-10</Pool>
        </Stratification>
        <Data>
          <RegTotal>11818</RegTotal>
          <CountA>546</CountA>
        </Data>
      </AnnualCount>
    </A100>
    <Z200 versionID="B12">
      <Metadata>
        <TY_Year>2020</TY_Year>
        <Benefit>true</Benefit>
      </Metadata>
      <Z200_Ratio>
        <Stratification>
          <Pool>12-18</Pool>
        </Stratification>
        <Data>
          <RegTotal>349</RegTotal>
          <X5>12</X5>
          <CountA>269</CountA>
          <CountB>0</CountB>
        </Data>
      </Z200_Ratio>
      <Z200_Ratio>
        <Stratification>
          <Pool>19-50</Pool>
        </Stratification>
        <Data>
          <RegTotal>911</RegTotal>
          <X5>192</X5>
          <CountA>520</CountA>
          <CountB>0</CountB>
        </Data>
      </Z200_Ratio>
      <Z200_Ratio>
        <Stratification>
          <Pool>5-11</Pool>
        </Stratification>
        <Data>
          <RegTotal>424</RegTotal>
          <X5>20</X5>
          <CountA>329</CountA>
          <CountB>0</CountB>
        </Data>
      </Z200_Ratio>
      <Z200_Ratio>
        <Stratification>
          <Pool>51-64</Pool>
        </Stratification>
        <Data>
          <RegTotal>590</RegTotal>
          <X5>456</X5>
          <CountA>336</CountA>
          <CountB>0</CountB>
        </Data>
      </Z200_Ratio>
    </Z200>
  </Measures>
</Submission>')



;WITH XMLNAMESPACES (DEFAULT 'http://www.ncqa.org/ns/2006/idss/hedis')
SELECT c.value('@id','VARCHAR(10)') AS msr
 --   , x.value('@id','VARCHAR(10)') AS  element
 --   , x.value('(value/text())[1]','VARCHAR(10)') AS Val
--INTO #t
FROM @xml.nodes('/submission/measures') AS t(c)
    CROSS APPLY t.c.nodes('/submission/measures') as f(x);

请尝试以下解决方案。

SQL

DECLARE @xml XML = 
N'<Submission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Measures>
        <A100 versionID="A01">
            <Metadata>
                <TY_Year>2020</TY_Year>
                <Benefit>true</Benefit>
            </Metadata>
            <AnnualCount>
                <Stratification>
                    <Pool>11-14</Pool>
                </Stratification>
                <Data>
                    <RegTotal>13071</RegTotal>
                    <CountA>542</CountA>
                </Data>
            </AnnualCount>
            <AnnualCount>
                <Stratification>
                    <Pool>15-18</Pool>
                </Stratification>
                <Data>
                    <RegTotal>12016</RegTotal>
                    <CountA>458</CountA>
                </Data>
            </AnnualCount>
            <AnnualCount>
                <Stratification>
                    <Pool>19-20</Pool>
                </Stratification>
                <Data>
                    <RegTotal>4591</RegTotal>
                    <CountA>129</CountA>
                </Data>
            </AnnualCount>
            <AnnualCount>
                <Stratification>
                    <Pool>2-3</Pool>
                </Stratification>
                <Data>
                    <RegTotal>5649</RegTotal>
                    <CountA>127</CountA>
                </Data>
            </AnnualCount>
            <AnnualCount>
                <Stratification>
                    <Pool>4-6</Pool>
                </Stratification>
                <Data>
                    <RegTotal>8995</RegTotal>
                    <CountA>366</CountA>
                </Data>
            </AnnualCount>
            <AnnualCount>
                <Stratification>
                    <Pool>7-10</Pool>
                </Stratification>
                <Data>
                    <RegTotal>11818</RegTotal>
                    <CountA>546</CountA>
                </Data>
            </AnnualCount>
        </A100>
        <Z200 versionID="B12">
            <Metadata>
                <TY_Year>2020</TY_Year>
                <Benefit>true</Benefit>
            </Metadata>
            <Z200_Ratio>
                <Stratification>
                    <Pool>12-18</Pool>
                </Stratification>
                <Data>
                    <RegTotal>349</RegTotal>
                    <X5>12</X5>
                    <CountA>269</CountA>
                    <CountB>0</CountB>
                </Data>
            </Z200_Ratio>
            <Z200_Ratio>
                <Stratification>
                    <Pool>19-50</Pool>
                </Stratification>
                <Data>
                    <RegTotal>911</RegTotal>
                    <X5>192</X5>
                    <CountA>520</CountA>
                    <CountB>0</CountB>
                </Data>
            </Z200_Ratio>
            <Z200_Ratio>
                <Stratification>
                    <Pool>5-11</Pool>
                </Stratification>
                <Data>
                    <RegTotal>424</RegTotal>
                    <X5>20</X5>
                    <CountA>329</CountA>
                    <CountB>0</CountB>
                </Data>
            </Z200_Ratio>
            <Z200_Ratio>
                <Stratification>
                    <Pool>51-64</Pool>
                </Stratification>
                <Data>
                    <RegTotal>590</RegTotal>
                    <X5>456</X5>
                    <CountA>336</CountA>
                    <CountB>0</CountB>
                </Data>
            </Z200_Ratio>
        </Z200>
    </Measures>
</Submission>';
-- DDL and sample data population, end

SELECT r.value('local-name(.)', 'VARCHAR(30)') AS [Msr]  
    , c.value('(Stratification/Pool/text())[1]', 'VARCHAR(30)') AS [Pool]
    , c.value('(Data/RegTotal/text())[1]', 'INT') AS [RegTotal]
    , c.value('(Data/X5/text())[1]', 'INT') AS [X5]
    , c.value('(Data/CountA/text())[1]', 'INT') AS [CountA]
    , c.value('(Data/CountB/text())[1]', 'INT') AS [CountB]
FROM @xml.nodes('/Submission/Measures/*[@versionID="B12"]') AS p(r)
    CROSS APPLY p.r.nodes('Z200_Ratio') AS t(c);

输出

+------+-------+----------+-----+--------+--------+
| Msr  | Pool  | RegTotal | X5  | CountA | CountB |
+------+-------+----------+-----+--------+--------+
| Z200 | 12-18 |      349 |  12 |    269 |      0 |
| Z200 | 19-50 |      911 | 192 |    520 |      0 |
| Z200 | 5-11  |      424 |  20 |    329 |      0 |
| Z200 | 51-64 |      590 | 456 |    336 |      0 |
+------+-------+----------+-----+--------+--------+