我需要一些其他XML查询的帮助。下面是我的XML列记录的示例:
<Fields>
<MappedFields>
<Field name="FormNumber" value="21" />
<Field name="ProcedureCode" value="T2023" />
<Field name="CurrentDate" value="4/23/2012" />
</MappedFields>
</Fields>
字段元素可以按任何顺序出现,因此它也可以像这样显示:
<Fields>
<MappedFields>
<Field name="ProcedureCode" value="G5532" />
<Field name="FormNumber" value="12" />
<Field name="CurrentDate" value="3/29/2011" />
</MappedFields>
</Fields>
我正在寻找的是一个查询,它将获取表格中所有记录的名称为“FormNumber”的字段的值。如果名为“FormNumber”的字段是XML中的第一个Field元素,则下面的查询可以工作。我需要的是一个查询,即使它不是第一个元素,也会找到它。有人可以帮我解决这个问题吗?
SELECT
X.Node.value(N'(Field/@value)[1]', 'nvarchar(max)') AS FormNumber
FROM
dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'/Fields/MappedFields') AS X(Node)
WHERE
X.Node.value(N'(Field/@name)[1]', 'nvarchar(max)') = 'FormNumber'
答案 0 :(得分:2)
您可以在xml路径中进行测试,例如[@name="FormNumber"]
。
SELECT
X.Node.value(N'(Field[@name="FormNumber"]/@value)[1]', 'nvarchar(max)') AS FormNumber
FROM
dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'//Fields/MappedFields') AS X(Node)
请注意,现在不需要WHERE
。
将测试移至CROSS APPLY
:
SELECT
X.Node.value(N'(./@value)[1]', 'nvarchar(max)') AS FormNumber
FROM
dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'//Fields/MappedFields/Field[@name="FormNumber"]') AS X(Node)
编辑 - 我将路径设为绝对路径(//),这两个示例都适用于我。