Как выбрать максимальную дату в столбце XML SQL Server 2005? - PullRequest
0 голосов
/ 01 декабря 2011

Я новичок в программировании 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>

Я хочу написать запрос, который будет возвращать максимальное значение 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 ()' не поддерживается.

Пожалуйста, могкто-нибудь, помогите мне написать этот запрос.Большое спасибо заранее.

1 Ответ

0 голосов
/ 01 декабря 2011

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

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