sql >> Base de Datos >  >> RDS >> Sqlserver

Elija un nodo XML en SQL Server según el valor máximo de un elemento secundario

¿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)')