A co powiesz na to:
SELECT
TOP 1
XMLCOL.value('(/user/name)[1]', 'nvarchar(20)') as 'UserName',
Usr.Token.value('(id)[1]', 'nvarchar(20)') AS 'ID',
Usr.Token.value('(endDate)[1]', 'DateTime') as 'EndDate'
FROM
dbo.MyTable
CROSS APPLY
xmlcol.nodes('/user/token') AS Usr(Token)
ORDER BY
Usr.Token.value('(endDate)[1]', 'DateTime') DESC
Zasadniczo bierzesz „atomową” część, taką jak „UserName” bezpośrednio z XML, a następnie stosujesz listę /user/token i wyodrębniasz poszczególne bity, które chcesz - otrzymujesz zestaw wyników składający się z trzech kolumn (UserName, ID, EndDate ) i możesz je zamawiać i filtrować.
Uwaga poboczna:zamiast tego:
XMLCOL.query('user/name').value('.','NVARCHAR(20)')
dlaczego tego nie użyjesz - jest to o wiele łatwiejsze!
XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')