Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Scegli un nodo XML in SQL Server in base al valore massimo di un elemento figlio

Che ne dici di questo:

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

Fondamentalmente prendi la parte "atomica" come "Nomeutente" direttamente dall'XML, quindi applichi in modo incrociato un elenco di /user/token ed estrai i singoli bit desiderati:ottieni un set di risultati di tre colonne (UserName, ID, EndDate ) e puoi ordinarli e filtrarli.

Nota a margine:invece di questo:

XMLCOL.query('user/name').value('.','NVARCHAR(20)') 

perché non lo usi - sembra molto più facile!

XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')