2013-04-10 53 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