2011-11-30 6 views
0

저는 SQL Server에서 XML 프로그래밍을 처음 접했습니다. 이것은 아마 너희들에게 간단한 질문 일 것이다!SQL Server 2005 XML Column에서 최대 날짜를 어떻게 선택합니까?

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