Как выбрать максимальную дату из XML-столбца SQL Server 2005?

Я новичок в программировании XML в SQL Server. Это, вероятно, будет простой вопрос для вас, ребята!

У меня есть таблица базы данных под названием TestXML в SQL Server 2005. Она имеет один столбец testXML с типом данных xml. Данные в этом столбце имеют следующий формат:

<TEST name="testName" status="Completed">
    <Status CompletedOn="2011-11-01T01:12:13Z"/>
    <Bar number="1" status="Pending">
        <Control RequestDate="2011-11-30T01:12:13Z"/>
    </Bar>
    <Bar number="2" status="Pending">
        <Control RequestDate="2011-11-30T01:11:13Z"/>
    </Bar>
    <Bar number="3" status="Pending">
        <Control RequestDate="2011-11-30T01:13:13Z"/>
    </Bar>
</TEST>

Я хочу написать запрос, который вернет max RequestDate из Bar/Control/@RequestDate, поэтому в приведенном выше примере я хочу, чтобы мой запрос возвращался - 2011-11-30T01:13:13Z

До сих пор я пробовал:

SELECT testXML.query('max(//@RequestDate)') from TestXml
WHERE testXML.value('(/TEST/@status)[1]', 'varchar(20)') = 'Completed'

Это возвращает пустое значение.... и если я попытаюсь использовать testXML.query('max(//string(@RequestDate))'), я получу следующую ошибку:

XQuery [TestXml.testXML.query()]: синтаксис XQuery '/function()' не поддерживается.

Пожалуйста, помогите мне написать этот запрос. Спасибо заранее.


person Narayan Akhade    schedule 30.11.2011    source источник


Ответы (1)


Мне удалось заставить его работать, используя временную таблицу. Не очень доволен решением, но думаю, есть ли лучший способ написать это:

SELECT  testXML.value('(/TEST/@name)[1]', 'varchar(100)') Name,
        testXML.value('(/TEST/@status)[1]', 'varchar(100)') StatusCol,
        Bar.Ctrl.value('(Control/@RequestDate)[1]', 'varchar(100)') RequestDate
INTO #dates
     -- Bar.Ctrl.query('max(data(Control/@RequestDate))').value('.', 'datetime')
FROM TestXML
CROSS APPLY testXML.nodes('/TEST/Bar') Bar(Ctrl)
WHERE testXML.value('(/TEST/@status)[1]', 'varchar(100)') = 'Completed'

SELECT Name, StatusCol, max(RequestDate) FROM #dates GROUP BY StatusCol, Name
person Narayan Akhade    schedule 01.12.2011