【问题标题】:T-SQL process custom XMLT-SQL 处理自定义 XML
【发布时间】:2021-07-03 14:46:33
【问题描述】:

我需要帮助来处理自定义 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);

【问题讨论】:

  • 你试过什么?为什么它不起作用?
  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)
  • 感谢所有 cmets,我添加了我的自我包含测试 sn-p
  • @Mich28,##3-4 仍然不见了。
  • #3。输出值在 #4 发布的图片上突出显示。 Microsoft SQL Server 2017 (RTM-CU22) (KB4577467) Tx YItzhak

标签: sql-server xml tsql xquery


【解决方案1】:

请尝试以下解决方案。

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 |
+------+-------+----------+-----+--------+--------+

【讨论】:

  • 非常感谢伊扎克!!我会有更多像“Z200_Ratio”这样的节点,但我会试着弄清楚如何扩展你的代码。
  • @Mich28,很高兴听到建议的解决方案对您有用。请不要忘记将其标记为答案。请投票:feedback.azure.com/forums/908035-sql-server/suggestions/…
  • 再次感谢伊扎克
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多