2009-11-13 75 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介绍文章 - 优秀资源!