Hvad med dette:
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
Du tager dybest set den "atomiske" del som "Brugernavn" direkte fra XML, og krydsanvender derefter en liste med /bruger/token og udtrækker de individuelle bits, du ønsker - du får et resultatsæt med tre kolonner (Brugernavn, ID, Slutdato ), og du kan bestille og filtrere dem.
Sidebemærkning:i stedet for dette:
XMLCOL.query('user/name').value('.','NVARCHAR(20)')
hvorfor bruger du ikke dette - føles meget nemmere!
XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')