[英]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()'
請嘗試以下解決方案。
它使用以下內容:
<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.