2011-11-30 90 views
0

我是SQL Server中的XML编程新手。这对你们来说可能是一个简单的问题!如何从SQL Server 2005 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> 

我想编写一个查询,将从酒吧/控制/ @ 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()]: The XQuery syntax '/function()' is not supported.

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

回答

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 
相关问题