2013-04-10 48 views
0

源数据看起来来自以下免费提供的描述大联盟棒球比赛的XML文件。棒球XML到SQL查询 - 优化

http://gd2.mlb.com/components/game/mlb/year_2013/month_04/day_09/gid_2013_04_09_atlmlb_miamlb_1/inning/

我已经创建了一个包含一排每GamePK /局,名为PBP XML列的SQL Server表。上述文件夹中的每个文件都成为此表中的一行。下面的查询是我尝试将XML解析为记录集。它可以工作,但对于大量的行非常缓慢,并且非常重复 - 似乎应该有一种更好的方法来在没有UNION子句的情况下执行此操作。在改进/优化的任何帮助,如果你使用的是最新版本的SQL Server赞赏

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) 

回答

0

,有一个新的列数据类型(XML)。

您可以将xpath应用到它,使查询列更容易。

而不是尝试将XML作为字符串存储在您的数据库中,我建议您实际将其存储为XML,并将其视为XML。

有一条学习曲线。你需要熟悉XPATH,但这不是火箭科学。

一个例子:

SELECT Id, PartitionMonth, EmailAddress, AcquisitionCodeId, FieldValues.value(' 
declare namespace s="http://domain.com/FieldValues.xsd"; 
data(/s:FieldValues/s:item/@value)[1]', 'varchar(200)') 
FROM Leads.Leads WITH (NOLOCK) 
WHERE Id = 190708 

又如通过关键字进行检索值:

SELECT r.EmailAddress, ar.Ip, ar.DateLog, 
    ar.FieldValues.value(' 
    declare namespace s="http://domain.com/FieldValues.xsd"; 
    data(/s:FieldValues/s:item[@key="First Name"]/@value)[1]', 'varchar(20)') FirstName, 
    ar.FieldValues.value(' 
    declare namespace s="http://domain.com/FieldValues.xsd"; 
    data(/s:FieldValues/s:item[@key="Last Name"]/@value)[1]', 'varchar(20)') LastName 
FROM Records.Records r WITH (NOLOCK) 
JOIN Records.AcquisitionRecords ar WITH (NOLOCK) ON r.Id = ar.Id 
WHERE ar.AcquisitionCodeId IN (19, 21, 30, 34, 36) 
AND ar.DateLog BETWEEN '1-mar-09' AND '31-mar-09' 

一个很好的地方,以获得对XML开始在SQL Server http://msdn.microsoft.com/en-US/library/ms189887(v=sql.90).aspx

+1

注意,它都将依赖你如何访问你的数据。如果您需要快速查找,您需要提取数据并将其存储在自己的列中并正确编制索引。 XML用于通用数据存储。 – Rgwan 2013-04-10 23:40:56