2012-04-30 3 views
0

Мне нужна дополнительная помощь с другим XML-запросом. Ниже приведен пример записи моего столбца XML:SQL Server 2008 XML Query

<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' 

ответ

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) 

Edit- Я сделал пути абсолютной (//) и оба примера работают для меня.

+0

Это хорошая информация для заметок. Тем не менее, он все еще только выбирает элемент Field, если он первый. Я бы хотел, чтобы он выбирал его, если он в любом порядке. –

+0

Я бы ожидал, что он выберет первый элемент Field, где name = "FormNumber", даже если это не первое поле. См. Edit for take 2. – Andrew

+0

Nice! Это решило проблему для меня! Благодаря! –