3

我有以下代码,但它只返回MonthDateand'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')

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

谢谢

4

1 回答 1

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()调用创建了一个XTbl带有单个 XML 列 ( ) 的“虚拟”表 ( XCol),其中每一行代表每个<MonthlyAmount>节点的 XML 片段(并且您必须在您的部分中包含一个AS table-alias(column-alias)CROSS APPLY以便您可以在查询中引用此虚拟表)。

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

于 2014-04-16T14:11:30.070 回答