これはどうですか:
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
基本的に、「UserName」のような「アトミック」部分を XML から直接取得し、/user/token のリストをクロス適用して、必要な個々のビットを抽出します。3 つの列 (UserName、ID、EndDate) の結果セットが得られます。 )、それらを並べ替えてフィルタリングできます。
補足:これの代わりに:
XMLCOL.query('user/name').value('.','NVARCHAR(20)')
これを使ってみませんか - ずっと簡単に感じます!
XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')