簡體   English   中英

TSQL for XML CROSS 適用於所有節點

[英]TSQL for XML CROSS apply to all nodes

是否有可能滿足 XML set of nodes is required for 'nodes()' 在我的示例中,我試圖獲取數據部分中的所有值,但 /Submission/Measures/* 列表不穩定,因此如果可能的話,我想為其添加動態。
下面的解決方案是在 CROSS APPLY 中使用硬編碼列表,我試圖在不指定列表的情況下獲取所有節點信息。

感謝所有人,尤其是 Khabinsky 先生,他在第一部分為我提供了幫助。

我的設置:Microsoft SQL 服務器 2017 (RTM-CU22)

所需的 output:

在此處輸入圖像描述

和可運行代碼,請參閱 <== 標記以獲取所需更改

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>
            <A100_Description>
                <Stratification>
                    <Pool>11-14</Pool>
                </Stratification>
                <Data>
                    <RegTotal>13071</RegTotal>
                    <CountA>542</CountA>
                </Data>
            </A100_Description>
            <A100_Description>    <Stratification>     <Pool>4-6</Pool>         </Stratification>
                <Data>   <RegTotal>8995</RegTotal>     <CountA>366</CountA>     </Data>
            </A100_Description>
            <A100_Description>   <Stratification>     <Pool>7-10</Pool>         </Stratification>
                <Data>   <RegTotal>11818</RegTotal>   <CountA>546</CountA>      </Data>
            </A100_Description>
        </A100>
        <B200 versionID="B12">
            <Metadata>
                <TY_Year>2020</TY_Year>
                <Benefit>true</Benefit>
            </Metadata>
            <B200_Description>
                <Stratification>
                    <Pool>12-18</Pool>
                </Stratification>
                <Data>
                    <RegTotal>349</RegTotal>
                    <X5>12</X5>
                    <CountA>269</CountA>
                    <CountB>0</CountB>
                </Data>
            </B200_Description>
        </B200>

      <z300 versionID="B33">
            <z300_Descr>
                <Stratification>
                    <Pool>19-50</Pool>
                </Stratification>
                <Data>
                    <RegTotal>33333</RegTotal>
                    <X5>3333</X5>
                    <CountA>333</CountA>
                    <CountB>33</CountB>
                </Data>
            </z300_Descr>
      </z300>
    </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/*') AS p(r)
 CROSS APPLY p.r.nodes('A100_Description, B200_Description, z300_Descr') AS t(c);     --How CROSS Apply to all nodes without listing them (to get all 3) ????
 --  CROSS APPLY p.r.nodes('/Submission/Measures/*') AS t(c);                 --<=== set of nodes is required for 'nodes()'    

請嘗試以下解決方案。

它使用以下內容:

  • XML 通配符'*' ,即星號,用於處理動態 XML 元素名稱。
  • 過濾掉不需要的負邏輯<Metadata> XML 片段。
  • OUTER APPLY模擬LEFT OUTER JOIN以保留沒有子場景的父數據集。

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>
            <A100_Description>
                <Stratification>
                    <Pool>11-14</Pool>
                </Stratification>
                <Data>
                    <RegTotal>13071</RegTotal>
                    <CountA>542</CountA>
                </Data>
            </A100_Description>
            <A100_Description>
                <Stratification>
                    <Pool>4-6</Pool>
                </Stratification>
                <Data>
                    <RegTotal>8995</RegTotal>
                    <CountA>366</CountA>
                </Data>
            </A100_Description>
            <A100_Description>
                <Stratification>
                    <Pool>7-10</Pool>
                </Stratification>
                <Data>
                    <RegTotal>11818</RegTotal>
                    <CountA>546</CountA>
                </Data>
            </A100_Description>
        </A100>
        <B200 versionID="B12">
            <Metadata>
                <TY_Year>2020</TY_Year>
                <Benefit>true</Benefit>
            </Metadata>
            <B200_Description>
                <Stratification>
                    <Pool>12-18</Pool>
                </Stratification>
                <Data>
                    <RegTotal>349</RegTotal>
                    <X5>12</X5>
                    <CountA>269</CountA>
                    <CountB>0</CountB>
                </Data>
            </B200_Description>
        </B200>
        <z300 versionID="B33">
            <z300_Descr>
                <Stratification>
                    <Pool>19-50</Pool>
                </Stratification>
                <Data>
                    <RegTotal>33333</RegTotal>
                    <X5>3333</X5>
                    <CountA>333</CountA>
                    <CountB>33</CountB>
                </Data>
            </z300_Descr>
        </z300>
    </Measures>
</Submission>';
-- DDL and sample data population, end

SELECT p.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/*') AS t1(p)
    OUTER APPLY t1.p.nodes('*[local-name()!="Metadata"]') AS t2(c);

Output

+------+-------+----------+------+--------+--------+
| Msr  | Pool  | RegTotal |  X5  | CountA | CountB |
+------+-------+----------+------+--------+--------+
| A100 | 11-14 |    13071 | NULL |    542 | NULL   |
| A100 | 4-6   |     8995 | NULL |    366 | NULL   |
| A100 | 7-10  |    11818 | NULL |    546 | NULL   |
| B200 | 12-18 |      349 | 12   |    269 | 0      |
| z300 | 19-50 |    33333 | 3333 |    333 | 33     |
+------+-------+----------+------+--------+--------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM