Wat dacht je hiervan:
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
U neemt in feite het "atomaire" deel zoals 'UserName' rechtstreeks uit de XML en past vervolgens een lijst van /user/token toe en extraheert u de individuele bits die u wilt - u krijgt een resultatenset van drie kolommen (UserName, ID, EndDate ) en u kunt deze bestellen en filteren.
Kanttekening:in plaats van dit:
XMLCOL.query('user/name').value('.','NVARCHAR(20)')
waarom gebruik je dit niet - voelt veel gemakkelijker!
XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')