Vad sägs om det här:
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 tar i princip den "atomiska" delen som "Användarnamn" direkt från XML, och sedan korsapplicerar du en lista med /användare/token och extraherar de individuella bitarna du vill ha - du får en resultatuppsättning med tre kolumner (Användarnamn, ID, Slutdatum ) och du kan beställa och filtrera dem.
Sidanteckning:istället för detta:
XMLCOL.query('user/name').value('.','NVARCHAR(20)')
varför använder du inte det här - känns mycket lättare!
XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')