使用xml .nodes()功能返回所有实例

时间:2014-04-16 14:01:31

标签: xml sql-server-2008 nodes cross-apply

我有以下代码,但它只返回MonthDate'Value'值的第一个实例。我一直在试验.nodes()Cross Apply,但无法弄清楚语法,我不断得到错误;

  

无效的对象名称' xmlContent.nodes'。

代码:

Declare @ngTest Table(ID int Identity, XmlContent XML)
Insert into @ngTest(XMLContent)(SELECT TOP 1 Cast(Cast(Data as ntext) as XML) FROM [Accounts].[dbo].[GoalChartData]  where goalID = 3661 and typeID = 2)

SELECT Top 1000 ID, 
    [XmlContent].value('(GoalMonteCarloChartResult/MonthlyMedianResults/MonthlyAmount/MonthDate/node())[1]', 'datetime') as MonthDate,
    [XmlContent].value('(GoalMonteCarloChartResult/MonthlyMedianResults/MonthlyAmount/Value/node())[1]','float') as Value
    from @ngTest CROSS APPLY [xmlContent].nodes('/MonthlyMedianResults/MonthlyAmount')

当我删除CROSS APPLY条件时,它会返回MonthDatevalue的第一个实例,但我想要它们全部。

谢谢

1 个答案:

答案 0 :(得分:2)

最有可能的是,你需要这样的东西:

SELECT Top 1000 
    ID, 
    MonthDate = XCol.value('(MonthDate)[1]', 'DATETIME'),
    [Value] = XCol.value('(Value)[1]', 'FLOAT') 
FROM
    @ngTest 
CROSS APPLY 
    [xmlContent].nodes('/MonthlyMedianResults/MonthlyAmount') AS XTbl(XCol)

.nodes()调用使用单个XML列(XTbl)创建“虚拟”表(XCol),其中每行代表每个<MonthlyAmount>的XML片段节点(您必须在AS table-alias(column-alias)部分添加CROSS APPLY,以便在查询中引用此虚拟表。

您需要将XQuery .value()应用于该虚拟表,以从此虚拟表或XML片段中获取值。