我有以下代码,但它只返回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
条件时,它会返回MonthDate
和value
的第一个实例,但我想要它们全部。
谢谢
答案 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片段中获取值。