【问题标题】:Traverse an XML Document in a SQL Server 2008 Database Column遍历 SQL Server 2008 数据库列中的 XML 文档
【发布时间】:2010-12-16 03:00:41
【问题描述】:

我有一个表,其中包含一个 XML 数据类型的列。我希望查看整个表,包括 XML 数据类型列。该视图将展开 XML 数据类型列的内容。我无法遍历整个 XML 文档并从特定 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

【问题讨论】:

  • 请尝试开始使用编辑器工具栏上的“代码”按钮 (010 101) 以突出显示部分并将其格式化为代码 - 诸如 SQL 语句之类的东西,任何应该修复的东西(例如表值)正确格式化会受益匪浅!

标签: xml sql-server-2008 types


【解决方案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 中的“燃料”子节点上,现在您可以使用 .value() 调用访问其中的各个值。

查看 Alex Homer 的 SQL Server 2005 XQuery 介绍文章 - 极好的资源!

【讨论】:

    【解决方案2】:

    值是一个标量函数。尝试改用 query()。

    http://msdn.microsoft.com/en-us/library/ms191474.aspx

    【讨论】:

    • 这很接近,但这不是我想要的。如何提取每个 FuelPathwayCode XML 节点的值?
    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多