Wie wäre es damit:
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
Sie nehmen im Grunde den "atomaren" Teil wie "UserName" direkt aus dem XML und wenden dann eine Liste von /user/token an und extrahieren die einzelnen gewünschten Bits - Sie erhalten eine Ergebnismenge aus drei Spalten (UserName, ID, EndDate ) und Sie können diese sortieren und filtern.
Randnotiz:Statt dessen:
XMLCOL.query('user/name').value('.','NVARCHAR(20)')
warum benutzt du das nicht - fühlt sich viel einfacher an!
XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')