2009-11-13 104 views
0

我有一個包含XML數據類型的列的表。我正在查看整個表格,包括XML數據類型列。該視圖將展開XML數據類型列的內容。我遇到了一個問題,它能夠遍歷整個XML文檔並從特定的XML節點中獲取值。遍歷SQL Server 2008數據庫列中的XML文檔

我正在使用此SQL查詢,它僅拾取FuelPathwayCode XML節點的第一個值實例。我正在尋找遍歷整個XML文檔並在一個結果集中查詢/ FuelPathwayCode XML節點的所有值?

SELECT 
    UploadFileID, Year, Quarter, 
    FileContent.value('(LCFS-Report/Fuel/FuelPathwayCode)[1]', 'varchar(100)') as FuelPathwayCode 
FROM LC_UploadXM 

我要找設置這樣的結果:

UploadFileID Year Quarter FuelPathWayCode PhysicalPathwayCode 
8    2010 4  CARBOB001   PP001 
8    2010 4  CARBOB002-HIGH PP001 

表列:

UploadFileID, 
Year, 
Quarter, 
CompanyID, 
FileType, 
FileContent, 
FileName, 
Description, 
Success, 
AddBy, 
AddDttm 
+0

請嘗試開始使用編輯器工具欄上的「代碼」按鈕(010 101)來突出顯示和格式化代碼 - 就像您的SQL語句一樣,任何應該修復的東西(如表格值)都會極大地受益於格式化正確! –

回答

1

你需要做一個CROSS APPLY和選擇您所需的XML的位,然後你需要做的就這些了一系列.value電話:

SELECT 
    UploadFileID, Year, Quarter, 
    FC.Node.value('(FuelPathwayCode)[1]', 'varchar(100)') as FuelPathwayCode 
FROM 
    LC_UploadXM 
CROSS APPLY 
    FileContent.nodes('/LCFS-Report/Fuel') as FC(Node) 

這基本上獲取XPath /LCFS-Report/Fuel中存在的所有XML節點,並使用它們就好像它們是表中的行一樣(模式是FC,「虛擬表」的名稱是「節點」 - 可以使用它們,但是您可以使用它們,完全可以使用你),然後將這些行交叉應用到基本選擇。

現在可以查詢「虛擬表」FC.Node的各個值 - 例如, XML中的「指針」已經位於XML中的「Fuel」子節點上,現在您可以使用.value()調用訪問其中的各個值。

退房Alex Homer's SQL Server 2005 XQuery介紹文章 - 優秀資源!