¿Qué tal esto:
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
Básicamente, toma la parte "atómica" como 'Nombre de usuario' directamente del XML, y luego aplica una lista cruzada de /usuario/token y extrae los bits individuales que desea:obtiene un conjunto de resultados de tres columnas (Nombre de usuario, ID, Fecha de finalización ) y puede ordenarlos y filtrarlos.
Nota al margen:en lugar de esto:
XMLCOL.query('user/name').value('.','NVARCHAR(20)')
¿Por qué no usas esto? ¡Se siente mucho más fácil!
XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')