我是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()'是 不支持。
请有人帮我写这个查询。非常感谢提前。
答案 0 :(得分: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