0

我是 SQL Server 中 XML 编程的新手。这对你们来说可能是一个简单的问题!

我在 SQL Server 2005 中有一个名为 TestXML 的数据库表。它有一个带有 xml 数据类型的 testXML 列。此列中的数据格式如下:

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

我想编写一个查询,它将从 Bar/Control/@RequestDate 返回最大 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()”。

请有人帮我写这个查询。提前谢谢了。

4

1 回答 1

0

我已经设法使用临时表让它工作。对解决方案不是很满意,但考虑是否有更好的方法来写这个:

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
于 2011-12-01T06:57:57.863 回答