Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Choisissez un nœud XML dans SQL Server en fonction de la valeur maximale d'un élément enfant

Que diriez-vous de ceci :

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

Vous prenez essentiellement la partie "atomique" comme "UserName" directement à partir du XML, puis appliquez une liste de /user/token et extrayez les bits individuels que vous voulez - vous obtenez un ensemble de résultats de trois colonnes (UserName, ID, EndDate ) et vous pouvez les classer et les filtrer.

Remarque :au lieu de ceci :

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

pourquoi ne pas l'utiliser - c'est beaucoup plus facile !

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