源数据看起来来自以下描述美国职业棒球大联盟比赛的免费 XML 文件。
我创建了一个 SQL Server 表,其中包含每个 GamePK/局的一行,以及一个名为 PBP 的 XML 列。上面文件夹中的每个文件都成为此表中的一行。下面的查询是我尝试将 XML 解析为记录集。它可以工作,但对于大量行来说非常慢,而且非常重复 - 似乎应该有更好的方法来做到这一点而没有 UNION 子句。感谢您对改进/优化的任何帮助
select
i.GamePK
,inn.value('@num', 'int') as inning
,itop.value('1', 'int') as IsTop
,itop.value('@num', 'int') as abNum
,itop.value('@batter', 'int') as batter
-- clip
,itoppit.value('@des', 'varchar(32)') as pitdesc
,itoppit.value('@id', 'int') as seq
,itoppit.value('@type', 'varchar(8)') as pittype
-- clip
from tblInnings i
cross apply PBP.nodes('/inning') as inn(inn)
cross apply inn.nodes('top/atbat') as itop(itop)
cross apply itop.nodes('pitch') as itoppit(itoppit)
union
select
i.GamePK
,inn.value('@num', 'int') as inning
,ibot.value('0', 'int') as IsTop
,ibot.value('@num', 'int') as abNum
,ibot.value('@batter', 'int') as batter
-- clip
,ibotpit.value('@des', 'varchar(32)') as pitdesc
,ibotpit.value('@id', 'int') as seq
,ibotpit.value('@type', 'varchar(8)') as pittype
--clip
from tblInnings i
cross apply PBP.nodes('/inning') as inn(inn)
cross apply inn.nodes('bottom/atbat') as ibot(ibot)
cross apply ibot.nodes('pitch') as ibotpit(ibotpit)